■ LEDフリーラン点滅                              

    はじめてPICを動作させたい場合このLEDフリーラン回路をつくってみるとよいと思います。 これができると以下の
   ことが習得できたことになります。
      PICの出力ポートのHigh/Low制御方法
      LEDを点灯させる電子回路設計技術及び、工作技術
   
  <試作品仕様>
   ・ 電源(+5V)を入れると LEDが 点灯 と消灯 ” を 無限に繰り返すこと
   ・ 電源をきるとLEDが消灯すること 

 (1) ウェイト方式    <CCS編>   <C18編>  <C30編 dsPIC>  <C30編 PIC24F>   <C32編 PIC32MX>
 (2) 割込み方式    <CCS編>   <C18編>  <C30編 dsPIC>  <C30編 PIC24F>   <C32編 PIC32MX>


(1)ウェイト方式

  マイコンの中である時間を待つ方法に”何もしない命令を繰り返す”(アセンブラのNOP命令を繰り返す)方法があります。
 PICの場合4個のシステムクロックで1命令が実行されますので たとえばシステムクロックが20MHzであればシステム
 クロックの周期は0.05μsecなので”なにもしない命令を1命令実行すると0.2μsec(=0.05μsec×4)の時間だけ待った
 ことにないます。ウェイト方式はビジー ウェイト(Busy Waiting)方式と呼ばれることもあります。ウェイトに関して、CCS
 コンパイラでは意識する必要はありませんがC18コンパイラの場合は意識してプログラミングする必要があります。

<CCS コンパイラ編>    PIC16F84


  <試作品回路図>
    PIC16F84をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル

 




<試作品外観>       前面                                     背面

          

   <プログラム例>

#include "16f84a.h" #use delay(clock=10000000) main(){ while(1) { output_low(PIN_A2); delay_ms(1000); output_high(PIN_A2); delay_ms(1000); } return 0; }

 

  <解説>
 ・ #include "16f84a.h"
    → プリプロセッサの先頭に使用するPICのヘッダーファイルを記載します。

 ・  #use delay(clock=10000000)
    → 後で 時間に関係するdelay_low( )関数を使用するので接続する外部クロック周波数を明記します。 
       この場合は10MHzの外部発振回路が接続されているので clock=10000000とします。

 
 ・ main()
   {
      return 0;
   }
       → C言語ではこのmain()関数のところからプログラムが実行されます。 
              main()関数の戻り値は整数に定義されているので  return 0 のように何か値を戻さないと
      コンパイラから警告が発せられます。 何か整数を戻せばよいので return 3;   でもOKです。

 ・ while(1)
      {
    文
   }
    → while(式) の式が真(非0 : 0でない値)であれば文を実行する。実行したあと式をチェックする。式が真で
       あればまた文を実行する。 while(1)は式が永遠に真であるのでPICの電源がONになった後OFFになるまで
       永遠に文が繰り返し実行されることになる。

 ・  output_low(PIN_A2);
    → Aポートのビット2(RA2端子)を 0 (low : 0V )にする。

 ・ delay_ms(1000);
     → プログラムは1000msec何もしないで待つ。 (システムクロックを基準時間として1000msecに相当するカウント
      数になるまでカウントを実施する)
     <追記>
        delay_ms(value)関数について
       割込みがはいってきた場合は割込みのプログラムが優先的に実行され終了後再びvalueの値になるまで
       プログラムはカウントをおこなう。尚、割込みに要した時間はvalueには加算されない。すなわちdelay_ms
               (value)の途中で割込みが入った場合は割込み処理時間に要した時間だけ待ち時間は長くなる。クリティカルな
       制御の場合は注意したい。
        valueは 0〜65535の整数値をとることができます。
      
      
 ・ output_high(1000);
    → Aポートのビット2(RA2端子)を 1 ( high : 5V )にする。


<CCSコンパイラ編>        PIC16F877

  PIC16F877を使った例を紹介します。(→回路図のPDFファイル
 <試作品回路図>


<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



   <プログラム例>
/*
------------------------------------------------------------------
PIC16F877
 Led Free Run
--------------------------------------------------------------------
*/


#include "16f877.h"
#use delay(clock=20000000)
#FUSES  HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP


main(){

        while(1)
        {
                //LED ON
                output_low(PIN_C4);     
                output_low(PIN_C5);
                output_low(PIN_D2);
                output_low(PIN_D3);

                delay_ms(500);

                //LED OFF
                output_high(PIN_C4);
                output_high(PIN_C5);
                output_high(PIN_D2);
                output_high(PIN_D3);

                delay_ms(500);
        }
        return 0;

}

<HI-TECHコンパイラ編> PIC16F877

PIC16F877をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)  




<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




          

   <プログラム例>


//HI-TEC 
// PIC16F877  LED FreeRun 
//ディレー方式
//  周期1秒 : 点灯0.5秒 消灯0.5秒

#include  <htc.h>

#define _XTAL_FREQ 20000000             //セラミック発振子:20MHz     ディレイ関数用

__CONFIG(
        PWRTEN          // パワーアップタイマ有 enable power up timer
        & BORDIS        // ブラウンアウトリセット有enable brown out reset
        & UNPROTECT     // コードプロテクト無 use UNPROTECT
        & WDTDIS        // ウォッチドックタイマ無
        & LVPDIS        // て電圧プログラミング無 low voltage programming disabled
        & HS            // 外部ハイスピード発振子 EXTRC Oscillator, RC on RA7/OSC1/CLKIN
        );


void delay_ms(unsigned long int time)   //1mse ディレー関数
{
        while(time)
        {
                __delay_ms(1);
                time--;
        }
}


void main(void)
{

        TRISD = 0;      //Dポートを出力モードに設定



        while(1)
        {
                RD0 = 1;
                RD1 = 1;                        //RD0を1に設定 → LED OFF
                RD2 = 1;
                RD7 = 1;
                delay_ms(500);          //1000msecディレー
        
                RD0 = 0;        
                RD1 = 0;                        //RD0を0に設定 → LED ON
                RD2 = 0;
                RD7 = 0;
                delay_ms(500);          //1000msecディレー
        }


}


 




<HI-TECHコンパイラ編> PIC16F1937

PIC16F1937をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)  

<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




          

   <プログラム例>

//HI-TEC LED FreeRun
//Delay style    Time 2sec: On Time 1sec,Off Time 1sec
//                                                PIC16F1937

#include  <htc.h>

#define _XTAL_FREQ 20000000             //Ceramic :20MHz     

//Configuration
__CONFIG(
                FOSC_HS &                       // EXTRC Oscillator, RC on RA7/OSC1/CLKIN
                WDTE_OFF &              // Power-up Timer Enable bit// PWRT disabled
                PWRTE_ON &              // MCLR Pin Function Select// RE3/MCLR/VPP pin function is MCLR
                MCLRE_ON &              // RE3/MCLR/VPP pin function is digital input
                CP_OFF  &               // Program memory code protection is enabled
                CPD_OFF &               // Data memory code protection is enabled
                BOREN_OFF &             // Clock Out Enable bit// CLKOUT function is disabled. I/O or oscillator function on RA6/CLKOUT
                CLKOUTEN_OFF &  // CLKOUT function is enabled on RA6/CLKOUT pin
                IESO_OFF &              // Fail Clock Monitor Enable// Fail-Safe Clock Monitor is enabled
                FCMEN_ON                // Fail-Safe Clock Monitor is disabled
                );


__CONFIG(
                WRT_OFF &       // 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control
                PLLEN_OFF &     // 4x PLL disabled
                STVREN_OFF &// Brown-out Reset Voltage selection// Brown-out Reset Voltage (VBOR) set to 1.9 V
                BORV_19 &       // Brown-out Reset Voltage (VBOR) set to 2.7 V
//              DEBUG_OFF &     // Background debugger is enabled
                LVP_OFF         // HV on MCLR/VPP must not be used for programming
                );




void delay_ms(unsigned long int msec)        //1msec delay function
{
        while(msec)
        { 
                msec--; 
                __delay_ms(1);  //1msec delay
                                        
        }
}


/*

void delay_ms(unsigned long int msec)        //1msec delay function at 20MHz(0.05μsec) 
                                                                                        //4サイクル1命令 → 1命令0.2μsec → 1μsec= NOP×5
{
        unsigned long int i,N;

        while(msec)
        { 
                msec--; 
                for(i = 0; i < 100; i++)
                {
                        asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
                        asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP"); asm("NOP");asm("NOP");asm("NOP");asm("NOP");asm("NOP");
                        asm("NOP");asm("NOP");  asm("NOP");//21個: 実測値1msec =1.01msec 
                }
        }
}
*/


void main()
{
        TRISD = 0;      //D port: outport


        while(1)
        {
                LATD0 = 1;                      //RD0 port LED off
                LATD1 = 1;                      //RD1 port LED off
                LATD2 = 1;                      //RD2 port LED off
                LATD7 = 1;                      //RD7 port LED off

                delay_ms(1000);         //1000msec delay

                LATD0 = 0;                      //RD0 port LED on
                LATD1 = 0;                      //RD1 port LED on
                LATD2 = 0;                      //RD2 port LED on
                LATD7 = 0;                      //RD7 port LED on

                delay_ms(1000);         //1000msec delay
        }


}

 




<C18コンパイラ編>    PIC18F452

 
  <試作品回路図>
    PIC18F452をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)   
    外付けされている水晶発振子の周波数は10MHzですが内部のPLL回路で4倍にしていますので内部動作周波数は
    40MHzです。





<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


   <プログラム例>
#include <p18f452.h>
#include <delays.h>

#pragma config OSC = HSPLL      // f = 40MHz ( = 10MHz × 4(PLL))
#pragma config WDT = OFF
#pragma config LVP = OFF


void delay_ms (long int cycle)  // CCSコンパイラと同じ delay_ms(long int) 関数を設計
{
        long int i = 0;
        for (i = 0; i < cycle; i++)Delay10KTCYx(1);     // 0.025μsec × 4 × 10000 = 1msec
}

void main (void)
{
 
  TRISB = 0;

  while (1)
    {
    
      PORTB = 0x00;     // BポートのLED ON

      delay_ms(1000);   //1000msec delay

      PORTB = 0xff;     // BポートのLED OFF

      delay_ms(1000);   // 1000msec delay
    }
}


<XC8 コンパイラ>  PIC18F14K50
 <試作品回路図>
    PIC18F14K50をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)   




<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




     

          

   <プログラム例>
#include <p18f14K50.h>
#include <xc.h>

long int Clock = 48; //12MHz x 4(PLL) = 48MHz
long Count_delay;

#define _XTAL_FREQ 48000000

#pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF,PCLKEN = ON
#pragma config FOSC = HS,PLLEN = ON, HFOFST = OFF           //PLL ON  Periferal= 12MHz x 4 = 48MHz
#pragma config PWRTEN = ON, BOREN = OFF, MCLRE = OFF, BORV = 30
#pragma config WDTEN = OFF,LVP = OFF,FCMEN = OFF, IESO = OFF
#pragma config CP0 = OFF,XINST = OFF
#pragma config STVREN = OFF, BBSIZ = OFF,CPB = OFF,CP1 = OFF,CPD = OFF  //省略するとwarnig がでる
#pragma config WRT0 = OFF,WRT1 = OFF,WRTC = OFF,WRTB = OFF,EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF //省略するとwarnig がでる
 



void delay_ms(unsigned short msec)        //1msec遅延関数
{
        unsigned short i;

        for(i=0; i<msec; i++)
        __delay_ms(1);  // __delay_ms(n); //1msec遅延関数
 //     __delay_us(1);  //__delay_us(n); //1μsec遅延関数

}


int main()
{
    ANSEL = 0x00;                                       // デジタルに設定
    TRISC = 0xF0;

    LATCbits.LATC0 = 0;         //Led RC0 : OFF
    LATCbits.LATC1 = 0;
    LATCbits.LATC2 = 0;
    LATCbits.LATC3 = 0;
    
    while(1)
    {
      
         LATCbits.LATC0 = 0;    //Led RC0 : OFF
         LATCbits.LATC1 = 0;
         LATCbits.LATC2 = 0;
         LATCbits.LATC3 = 0;

         delay_ms(500);

         LATCbits.LATC0 = 1;    //Led RC0 : ON
         LATCbits.LATC1 = 1;
         LATCbits.LATC2 = 1;
         LATCbits.LATC3 = 1;
         
         delay_ms(500);
      

    }
    return 0;
}

 


<C30編 dsPIC>   ウェイト(ディレー)方式
   dsPIC 30F2012の場合

  <試作品回路図>
    dsPIC30F2012を使った例を以下に示します。(→回路図のPDFファイル
   PICへの書き込みはICSPをつかっています。
      

 <試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



<プログラム例>

///************************************************************/
//*  LED Free Run
//*   周期4sec   点灯2sec  消灯2sec
//*  
//************************************************************/
//Link File :p30f4013.gld
#include        "p30f4013.h"

#define Clock   80000000

_FOSC(CSW_FSCM_OFF & XT_PLL8);                   // (10MHz)x8=80MHz
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);    

void delay_ms(unsigned int);


void delay_ms(unsigned int N)
{
        __delay32(Clock/4000*N);
}

int     main(void) {

        TRISB = 0;                              // 下位2ピンのみ入力

        while(1)
        {                                               
                LATBbits.LATB3 = 0;             //点灯
                LATBbits.LATB4 = 0;
                LATBbits.LATB5 = 0;
                LATBbits.LATB6 = 0;
                LATBbits.LATB7 = 0;
                LATBbits.LATB8 = 0;
                delay_ms(2000);

                LATBbits.LATB3 = 1;             //消灯
                LATBbits.LATB4 = 1;
                LATBbits.LATB5 = 1;
                LATBbits.LATB6 = 1;
                LATBbits.LATB7 = 1;
                LATBbits.LATB8 = 1;
                delay_ms(2000);

        }
}

<C30編 PIC24F LEDフリーラン点滅  ウェイト(ディレー)方式>   PIC24FJ64GA002
 PICへの書き込みは ICD2 → ICSPで行なっています。

<試作品回路図>
    PIC24FJ64GA002を使った例を以下に示します。(→回路図のPDFファイル


<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


   <プログラム例>
///************************************************************/
// LED フリーラン点滅 
//         周期 2sec (ON:1sec OFF:1sec)
//************************************************************/
#include        "p24FJ64GA002.h"

#define Clock   32000000        // 単位はHzで指定

/// コンフィギュレーション ビットの設定
_CONFIG1( JTAGEN_OFF &  //JTAGポート: OFF
                         GCP_OFF &      //コードプロテクト: OFF
                        GWRP_OFF &      //書き込みプロテクト: OFF
                        BKBUG_OFF &     //バックグランドデバック: OFF
                        COE_OFF &       //クリップオン エミュレーション: OFF 
                        ICS_PGx1&       //ICDピンの選択: EMUC/EMUDをPGC1/PGD1と共用
                        FWDTEN_OFF )//ウォッチドックタイマ: OFF 


_CONFIG2( IESO_OFF &    // 2速度スタートアップ機能:OFF
                FNOSC_FRCPLL &  //内臓高速RC発振(8MHZ)回路 + 4倍PLL → 32MHz(= 8MHz × 4)
                FCKSM_CSDCMD &  //クロック切替え制御:OFF クロックモニタ:OFF
                OSCIOFNC_OFF &  //OSCO/RC15 function: OSCO or Fosc/2
                IOL1WAY_OFF &   //RP Register Protection: Unlimited Writes To RP Registers
                I2C1SEL_PRI &   //I2C1 pins Select: Use Primary I2C1 pins
                POSCMOD_NONE)   //発振回路モード Oscillator Selection:  Primary disabled




void delay_ms(unsigned int);



void delay_ms(unsigned int N)   //1msec のディレー関数
{
        __delay32(Clock/2000*N);        //システムクロック周波数2000000HzのPICの1サイクルディレー時間=1μsec
}                                                               // → Clock(Hz)/2000 = 1000μsec = 1msec 
                                                                //32000000/2000 = 160000 → nop × 16000回 のウェート(= 1msec)
        

/// メイン関数
int     main(void)
{

        TRISB = 0;      //Bポートを出力モードに設定
        CLKDIV = 0;     //Clock Divider register: 分周なし → 32MHz CPU Peripheral Clock Ratio = 1:1
                                //CPU Peripheral Clock Ratio Select bits CLKDIV<14:12>)
                                //111 = 1:128
                                //110 = 1:64
                                //101 = 1:32
                                //100 = 1:16
                                //011 = 1:8
                                //010 = 1:4
                                //001 = 1:2
                                //000 = 1:1

        while(1)
        {       
                // LED OFF
                LATBbits.LATB15 = 1;
        
        
                delay_ms(1000);

                //LED ON
                _LATB15 = 0;            // 右記表記と同じ意味    LATBbits.LATB4 = 0;
        

                delay_ms(1000);
        }
        return 0;
}

<PIC32MX>ディレー方式        C32コンパイラ編
  PIC32MX460F512L の場合

 

<試作品回路図>
    PIC32MX460F512Lを使った例を以下に示します。(→回路図のPDFファイル


<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

 (注)上記写真に映っている部品について
   ★ PIC32MX460F512LののQFPが半田付けされているキバンアッシーはマイクロチップ社が開発用部品としてネットで販売している
     PIM(Plug in Module)と呼ばれるものです。EXPLORE 16と呼ばれる開発用ターゲットボード用のCPUボードです。
      上記写真にのっているPIMは以下です。
       ・メーカ:  マイクロチップテクノロジー社
       ・部品名称: Plug In Module ( →URL
       ・部品番号:  MA320002  ( →URL)
       ・販売単価: 25ドル
       ・コネクタ諸元: このキバンには下記の1.27mmピッチの25極メスコネクタが4個ついています。   
                  メーカ: Samtec
                  型式: SLM-125-01-L-S


   ★ ヘッダーピン
      ヘッダーピンのメーカ、型式、ネットで販売している会社については、マイクロチップ・テクノロジー・ジャパン株式会社のセールスの方から
     おしえていただきました。

     ・メーカ  : Samtec           http://www.samtec.com/
     ・型式 : TMS-125-01-G-S (→ カタログPDFファイル
     ・諸元: 1.27mmピッチのピンヘッダー、 PIMとの勘合するピンの長さが5.84mmと長くなっておりPIMとの勘合接触信頼性を重視していることがうかがえる。
          尚、ピンヘッダーに関する規格はないようである。 メーカによりピンの断面(太さ)が角0.46×0.46mmとは異なるヘッダーピンも存在する。接触信頼性の
          面から寸法値が異なる他メーカ品は避けたい。
          
     ・販売している会社 :

    (1)  AVNET(米国、通販会社) (→ URL)
         ・TMS-125-01-G-S がのっているAVNETのURL は下記です。
http://avnetexpress.avnet.com/store/em/EMController/Connector-Headers-and-PCB-Receptacles/Samtec/TMS-125-01-G-S-RA/_/R-1251095/A-1251095/An-0?action=part&catalogId=500201&langId=-10&storeId=500201&chLangId=-10

        ・AVNETの販売単価: 2.49ドル(1〜499個)、2.06ドル(500〜999個)、1.79ドル(1000個〜 ) //2010.8.22現在
                   最小販売単位は1個です。私はAVNETから20個、カードで購入しましたが送料は3.99ドルでした。
        ・AVNETの納期: 約3週間

      (2) 潟}ルツ電波 (→ URL) 2010年9月9日発売開始 !!
         ・TMS-125-01-G-S がのっているURL は下記です。
               https://www.marutsu.co.jp/user/shohin.php?p=94446
         ・283円/個(1〜3個)、 262円(4個以上)
 //2010.9/10現在





ヘッダーピン外観 寸法要約(→ PDFファイル

     

    ★ ユニバーサルキバン
      ・プリントパターンを 基板設計エディタ K2CADで設計して、 ネット通販のキバン屋さんに製作してもらいました。
      ・キバン諸元
        @寸法: 120mm × 150mm × 1.6mm
        A層数: 両面キバン
        Bレジスト: なし
      ・パターン仕様
        @マイクロチップのPIMを Samtec社ヘッダーピンTMS-125-01-G-S(1.27mmピッチ 25極)を介して接続する。
        APIMの端子はすぺて2.54mmピッチの3連のビア端子にオープンの状態で周辺に引き出す。
        B上記100個の3連ビア端子の外周をグランドパターンで囲む
        Cグランドパターンの更に外側を電源用のパターンで囲む
        E3端子レギュレータによる電源関連のパターンはあらかじめパターン化しておく
        F下記コネクタはとりつけられるようにパターン設計をしておく
           ICSP用RJ12コネクタ、USB Aコネクタ、USB mini Bコネクタ
      ・キバン製作
        製作を依頼したキバン屋さん: キバン本舗 ( → URL
        製作費用(キバン15枚、版代 及び送料の合計): 36,500 円(税込、カード決済)
        納期: 1週間


        

自作ユニバーサルキバン外観
(部品面)
自作ユニバーサルキバン外観
(半田面)

     

        ・プリントパターンデータ
         (1) 実体配線的回路図 (→ PDFファイル)             

        (2)プリントパターンのPDFファイル(→PDFファイル
          キバン屋さんにキバン製作を頼む場合、PDFファイルも参考に添付した方が間違いが少ないようです。
        (3)プリントパターンのデータファイル(→LHZファイル
          ガーバーデータ 及びドリルデータ等です。改良した為、上記の写真とは若干異なります。このLHZファイルをキバン屋さんに
          送ればキバンが製作できます。キバン製作を依頼する際はレジスト不要とキバン屋さんに指示してください。ユニバーサル
          キバンの場合レジストがない方が使いやすいと思います。
           データファイルはご随意にお使いになってかまいませんが、出来上がったキバンに関するトラブル等に関してはいっさい
          責任は負いかねますのであらかじめご了承願います。下記はこのキバン設計のK2CADのソースファイルです。データファイル
          内容の確認や 自分専用のユニバーサルキバンを設計する場合等にご利用ください。
             基板ファイル(→ .kcdファイル) 、基板設計ファイル(→ .bpfファイル


   <プログラム例>

// PIC32MX460F512L    LEDフリー点滅 
//                 周期2秒(点灯:1秒、消灯:1秒)
#include <proc/p32mx460f512l.h>         //PIC32MX460F512L
#include <plib.h>               // PIC32 peripheral library 
                                                        //for SYSTEMConfigPerformance()

// コンフィギュレーション設定
// CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off
#pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2
#pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF, ICESEL=ICS_PGx2

int Clock = 80000000;   //80MHz
//int sysCLK = 80000000;                // == your int Clock = 80000000; //80MHz 

void delay_us(unsigned int usec)        //1μsec遅延関数
{
        int count;

        count = (int)(Clock/20000000)*usec;

        do      //実測: at Clock=80000000
        {       //delay_us(1000)→1003μsec、 delay_us(100)→102μsec、delay_us(10)→11μsec、delay_us(1)→1.6μsec

                asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");
                asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");     asm("NOP");

                count--;        
        }while(count != 0);
}

/*
void DelayUS(WORD us) 
{ 
 DWORD start = _CP0_GET_COUNT(); 
 DWORD end = start + sysCLK / 1000000 / 2 * us; 
 if (end > start) while (_CP0_GET_COUNT() < end); 
 else while (_CP0_GET_COUNT() > start || _CP0_GET_COUNT() < end); 
} 
*/


void delay_ms(unsigned int msec)        //1msec遅延関数
{
        unsigned int i;
        
        for(i=0; i<msec; i++)
//      DelayUS(1000);  
        delay_us(1000);
}


int main(void)
{
        SYSTEMConfigPerformance(80000000);      // システム最適化

        DDPCONbits.JTAGEN = 0;  //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に、設定する必要があり;ます。
                //From the data sheet
                //"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices.
                // At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O,
                // the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug,
                // the user’s application code must maintain JTAGEN bit = 1." 
                        
        TRISAbits.TRISA4 = 0;
        TRISAbits.TRISA5 = 0;
        TRISAbits.TRISA6 = 0;
        TRISAbits.TRISA7 = 0;

        while(1)
        {
                LATAbits.LATA4 = 0;
                LATAbits.LATA5 = 0;
                LATAbits.LATA6 = 0;
                LATAbits.LATA7 = 0;

                delay_ms(1000);         //実測値: 1.003sec
//              delay_ms(1);            //実測値: 1.003msec
//              delay_us(100);          //実測値: 102μsec
//              delay_us(10);           //実測値: 11μsec
//              delay_us(1);            //実測値: 1.6μsec


                LATAbits.LATA4 = 1;
                LATAbits.LATA5 = 1;
                LATAbits.LATA6 = 1;
                LATAbits.LATA7 = 1;

                delay_ms(1000);
//              delay_ms(1);
//              delay_us(100);
//              delay_us(10);
//              delay_us(1);

        }
}


<PIC32MZ  Harmony  XC32 コンパイラ編>ディレー方式 
  PIC32MZ2048ECG144 の場合

<試作品の仕様>
 1.  ハード 

  PIC: PIC32MZ2048ECH144 rev.3( at Microchip PIC32MZ Embedded Connectivity (EC) Starter Kit

  Microchip 168pin to 132pin Adaptor board、 I/O Expansion board  及び ユニバーサルキバンのキバン構成とする。

2.  開発環境

Harmony Ver.1.00 XC32 Ver.1.33 MPLABX Ver.2.15USBブートローダ書込み




<試作品回路図>
    PIC32MZ2048ECG144を使った例を以下に示します。(→回路図のPDFファイル



<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



     

          

   <プログラム例>

//以下 main.c
//---------------------------------------------------------------------------------------------------
/*******************************************************************************
  MPLAB Harmony Project Main Source File

  Company:
    Microchip Technology Inc.
  
  File Name:
    main.c

  Summary:
    This file contains the "main" function for an MPLAB Harmony project.

  Description:
    This file contains the "main" function for an MPLAB Harmony project.  The
    "main" function calls the "SYS_Initialize" function to initialize the state 
    machines of all MPLAB Harmony modules in the system and it calls the 
    "SYS_Tasks" function from within a system-wide "super" loop to maintain 
    their correct operation. These two functions are implemented in 
    configuration-specific files (usually "system_init.c" and "system_tasks.c")
    in a configuration-specific folder under the "src/system_config" folder 
    within this project's top-level folder.  An MPLAB Harmony project may have
    more than one configuration, each contained within it's own folder under
    the "system_config" folder.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

//Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include <stddef.h>                     // Defines NULL
#include <stdbool.h>                    // Defines true
#include <stdlib.h>                     // Defines EXIT_FAILURE
#include "system/common/sys_module.h"   // SYS function prototypes


// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
    /* Initialize all MPLAB Harmony modules, including application(s). */
    SYS_Initialize ( NULL );

    while ( true )
    {
        /* Maintain state machines of all polled MPLAB Harmony modules. */
        SYS_Tasks ( );

    }

    /* Execution should not come here during normal operation */

    return ( EXIT_FAILURE );
}


/*******************************************************************************
 End of File
*/






//以下 app.c
//---------------------------------------------------------------------------------
/*******************************************************************************
  MPLAB Harmony Application Source File
  
  Company:
    Microchip Technology Inc.
  
  File Name:
    app.c

  Summary:
    This file contains the source code for the MPLAB Harmony application.

  Description:
    This file contains the source code for the MPLAB Harmony application.  It 
    implements the logic of the application's state machine and it may call 
    API routines of other MPLAB Harmony modules in the system, such as drivers,
    system services, and middleware.  However, it does not call any of the
    system interfaces (such as the "Initialize" and "Tasks" functions) of any of
    the modules in the system or make any assumptions about when those functions
    are called.  That is the responsibility of the configuration-specific system
    files.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files 
// *****************************************************************************
// *****************************************************************************

#include "app.h"

# ifndef _MY_INCLUDE_PERIPHERAL
#define   _MY_INCLUDE_PERIPHERAL
#include <peripheral/peripheral.h>
#include <peripheral/ports/plib_ports.h>
#endif

int delay_Clock = 200000000;   //200MHz

void delay_us(volatile unsigned int usec)        //1μsec遅延
{
        volatile  int count;

        count = (int)(delay_Clock/20000000)*usec;


        do      //実測 at 200MH (Clock=200000000)
        {       //delay_us(1000):1000.4μsec  delay_us(100):100.6μsec  delay_us(10):10.5μsec  delay_us(1):1.5μsec
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP");
                asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");

                count--;
        }while(count != 0);


}

void delay_ms(volatile unsigned int msec)        //1msec遅延
{
        volatile unsigned int i;         //実測:at200MH (Clock=200000000)//delay_ms(1): 1.0006msec   delay_ms(100):100.04msec

        for(i=0; i<msec; i++)
        delay_us(1000);
}



// *****************************************************************************
// *****************************************************************************
// Section: Global Data Definitions
// *****************************************************************************
// *****************************************************************************

// *****************************************************************************
/* Application Data

  Summary:
    Holds application data

  Description:
    This structure holds the application's data.

  Remarks:
    This structure should be initialized by the APP_Initialize function.
    
    Application strings and buffers are be defined outside this structure.
*/

APP_DATA appData;


// *****************************************************************************
// *****************************************************************************
// Section: Application Callback Functions
// *****************************************************************************
// *****************************************************************************

/* TODO:  Add any necessary callback funtions.
*/


// *****************************************************************************
// *****************************************************************************
// Section: Application Local Functions
// *****************************************************************************
// *****************************************************************************

/* TODO:  Add any necessary local functions.
*/


// *****************************************************************************
// *****************************************************************************
// Section: Application Initialization and State Machine Functions
// *****************************************************************************
// *****************************************************************************

/*******************************************************************************
  Function:
    void APP_Initialize ( void )

  Remarks:
    See prototype in app.h.
 */

void APP_Initialize ( void )
{
    /* Place the App state machine in its initial state. */
    appData.state = APP_STATE_INIT;
    
    /* TODO: Initialize your application's state machine and other
     * parameters.
     */

      //LEDポート 出力ポートに設定--------------------

    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 0 );//vs. PLIB_PORTS_PinDirectionInputSet( PORTS_ID_0, PORT_CHANNEL_H, 0 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 1 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 2 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, 15 );

/*
    TRISHbits.TRISH0 = 0;   //RH0 : out //LED 出力ポートに設定
    TRISHbits.TRISH1 = 0;   //RH1 : out
    TRISHbits.TRISH2 = 0;   //RH2 : out
    TRISGbits.TRISG15 = 0;  //RG15 : out
*/



    //初期設定: LED消灯
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 0 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 1 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 2 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 );

/*
    LATHbits.LATH0 = 0;     //RH0 = 0  LED --> OFF  //LED消灯
    LATHbits.LATH1 = 0;     //RH1 = 0  LED --> OFF
    LATHbits.LATH2 = 0;     //RH2 = 0  LED --> OFF
    LATGbits.LATG15 = 0;    //RG15 = 0 LED --> OFF
*/

}


/******************************************************************************
  Function:
    void APP_Tasks ( void )

  Remarks:
    See prototype in app.h.
 */

void APP_Tasks ( void )
{
    /* Check the application's current state. */
    switch ( appData.state )
    {
        /* Application's initial state. */
        case APP_STATE_INIT:
        {

            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 0 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 1 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 2 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 );

   /*
            LATHbits.LATH0 = 1;     //RH0 = 1  LED --> ON   //LED点灯
            LATHbits.LATH1 = 1;     //RH1 = 1  LED --> ON
            LATHbits.LATH2 = 1;     //RH2 = 1  LED --> ON
            LATGbits.LATG15 = 1;    //RG15 = 1 LED --> ON
*/
            delay_ms(500);     //500msec ディレー

            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 0 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 1 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 2 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 );

/*
            LATHbits.LATH0 = 0;     //RH0 = 0  LED --> OFF  //LED消灯
            LATHbits.LATH1 = 0;     //RH1 = 0  LED --> OFF
            LATHbits.LATH2 = 0;     //RH2 = 0  LED --> OFF
            LATGbits.LATG15 = 0;    //RG15 = 0 LED --> OFF
*/

            delay_ms(500);     //500msec ディレー

            break;
        }

        /* TODO: implement your application state machine.*/

        /* The default state should never be executed. */
        default:
        {
            /* TODO: Handle error in application's state machine. */
            break;
        }
    }
}
 

/*******************************************************************************
 End of File
 */




//以下 system_init.c
//----------------------------------------------------------------------------------------
/*******************************************************************************
  System Initialization File

  File Name:
    system_init.c

  Summary:
    This file contains source code necessary to initialize the system.

  Description:
    This file contains source code necessary to initialize the system.  It
    implements the "SYS_Initialize" function, configuration bits, and allocates
    any necessary global system resources, such as the systemObjects structure
    that contains the object handles to all the MPLAB Harmony module objects in
    the system.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include "system_config.h"
#include "app.h"
#include "system_definitions.h"


// ****************************************************************************
// ****************************************************************************
// Section: Configuration Bits
// ****************************************************************************
// ****************************************************************************

//コンフィグ設定
// DEVCFG0
#pragma config EJTAGBEN = NORMAL
#pragma config DBGPER = ALLOW_PG2
#pragma config FSLEEP = OFF
#pragma config FECCCON = OFF_UNLOCKED
#pragma config BOOTISA = MIPS32
#pragma config TRCEN = OFF
#pragma config ICESEL = ICS_PGx2
#pragma config JTAGEN = OFF //JTAG ポート Disable
#pragma config DEBUG = ON


// DEVCFG1
#pragma config FNOSC = SPLL //発振器選択:システム発振回路 //内蔵FRC(8MHz)の場合:FNOSC = FRCDIV   //Oscillator Selection Bits (Fast RC Osc w/Div-by-N (FRCDIV))
#pragma config DMTINTV = WIN_127_128 // DMT Count Window Interval (Window/Interval value is 127/128 counter value)
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disable SOSC)
#pragma config IESO = OFF // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = EC // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = ON // CLKO Output Signal Active on the OSCO Pin (Enabled)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disabled, FSCM Disabled)
#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576)
#pragma config WDTSPGM = STOP // Watchdog Timer Stop During Flash Programming (WDT stops during Flash programming)
#pragma config WINDIS = NORMAL // Watchdog Timer Window Mode (Watchdog Timer is in non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Disable
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window size is 25%)
// DMTCNT = No Setting
#pragma config FDMTEN = OFF // Deadman Timer Enable (Deadman Timer is disabled)


//システムクロック:200MHz
//ペリフェラル周波数:OSC configulationで設定   //8種類選択可能
//PBxDIV: PERIPHERAL BUS CLOCK DIVISOR CONTROL レジスタのPBDIV<6:0>: Peripheral Bus Clock Divisor Control ビットで設定    //1/1 ? 1/128
//DEVCFG2
#pragma config FPLLIDIV = DIV_3 // 1/3  // PLL Input周波数 = 24MHz ÷ 3 = 8MHz     // System PLL Input Divider (1x Divider)
#pragma config FPLLRNG = RANGE_5_10_MHZ //PLL周波数入力範囲設定// System PLL Input Range (5-10 MHz Input)  //8MHz故
#pragma config FPLLICLK = PLL_POSC //主発振回路選択 //内蔵FRC(8MHz)の場合はFPLLICLK = PLL_FRC//  System PLL Input Clock Selection (POSC is input to the System PLL)
#pragma config FPLLMULT = MUL_50 //PLL倍率:50倍 //8MHz x 50 = 400MHz  //System PLL Multiplier (PLL Multiply by 50)
#pragma config FPLLODIV = DIV_2 // 1/2  //システムクロック = 400MHz ÷ 2 = 200MHz 
#pragma config UPLLFSEL = FREQ_24MHZ //USBのPLL入力を 24MHz→12MHzに変換 // USB PLL Input Frequency Selection (USB PLL input is 12 MHz)
#pragma config UPLLEN = ON //USBのPLL変換:イネーブル // USB PLL Enable (USB PLL is enabled)


// DEVCFG3
//イーサネット  // USERID = No Setting
#pragma config FMIIEN = ON // Ethernet RMII/MII Enable (MII Enabled)
#pragma config FETHIO = ON // Ethernet I/O Pin Select (Default Ethernet I/O)
#pragma config PGL1WAY = ON // Permission Group Lock One Way Configuration (Allow only one reconfiguration)
#pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration)
#pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration)
#pragma config FUSBIDIO = OFF // USB USBID Selection (Controlled by Port Function)



/*** BF1SEQ0 ***/

#pragma config TSEQ =       0xffff
#pragma config CSEQ =       0xffff


// *****************************************************************************
// *****************************************************************************
// Section: Library/Stack Initialization Data
// *****************************************************************************
// *****************************************************************************/



// *****************************************************************************
// *****************************************************************************
// Section: Driver Initialization Data
// *****************************************************************************
// *****************************************************************************



// *****************************************************************************
// *****************************************************************************
// Section: System Data
// *****************************************************************************
// *****************************************************************************

/* Structure to hold the object handles for the modules in the system. */
SYSTEM_OBJECTS sysObj;

// *****************************************************************************
// *****************************************************************************
// Section: Module Initialization Data
// *****************************************************************************
// *****************************************************************************


/*** System Device Control Initialization Data ***/

const SYS_DEVCON_INIT sysDevconInit =
{
    .moduleInit = {0},
};


// *****************************************************************************
// *****************************************************************************
// Section: Static Initialization Functions
// *****************************************************************************
// *****************************************************************************


// *****************************************************************************
// *****************************************************************************
// Section: System Initialization
// *****************************************************************************
// *****************************************************************************

/*******************************************************************************
  Function:
    void SYS_Initialize ( SYS_INIT_DATA *data )

  Summary:
    Initializes the board, services, drivers, application and other modules.

  Remarks:
    See prototype in system/common/sys_module.h.
 */

void SYS_Initialize ( void* data )
{
    /* Core Processor Initialization */
    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);
    SYS_DEVCON_PerformanceConfig(SYS_DEVCON_SYSTEM_CLOCK);

    /* System Services Initialization */    

    /* Initialize Drivers */

    /* Initialize System Services */

    /* Initialize Middleware */

    /* Initialize the Application */
    APP_Initialize();
}

/*******************************************************************************
 End of File
*/




 





(2)割込み方式
  割込み方式とはある仕事(メインの処理)をしている時に、電話がかかってきたら(割込みが発生したら)電話応対を
 おこない(別の処理をおこない)電話応対が終わったら元の仕事(メインの処理)に戻る処理方法です。PICには1個以上の
 タイマが内臓されています。この内臓タイマを一定周期毎に動作させることによって所定時間待ったり、所定時間毎に処理
 をおこなうことができます。
 一定時間毎に動作するタイマのことをインターバルタイマと呼びます。

  


<HI-TECH編>   PIC16F877


PIC16F877をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)  




<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




          

   <プログラム例>

//HI-TEC 
// PIC16F877  LED FreeRun  
// 割り込み方式
//  周期2秒 : 点灯 1秒  消灯 2秒

#include  <htc.h>


__CONFIG(
        PWRTEN          // パワーアップタイマ有 enable power up timer
        & BORDIS        // ブラウンアウトリセット有enable brown out reset
        & UNPROTECT     // コードプロテクト無 use UNPROTECT
        & WDTDIS        // ウォッチドックタイマ無
        & LVPDIS        // て電圧プログラミング無 low voltage programming disabled
        & HS            // 外部ハイスピード発振子 EXTRC Oscillator, RC on RA7/OSC1/CLKIN
        );

int LED = 0;

void interrupt T1Handler(void)  //100msec毎の割り込み
{
        TMR1IF = 0;     //フラグクリア

//アップカウンタ設定
//Clock: 20MHz/4 → 5MHz 0.2μsec
//プリスケーラ 1/8 //Prescale Select bits
//    (65536 -N)*0.2*8 = 100000
//     N = 65536 - 100000 /8/0.2  = 3036
//     3036/256 = 11.8593
//     3036 -256*11 = 220
//     59286 ÷ 256 = 11 余り220
        TMR1H = 11;                             //
        TMR1L = 220;


        if(LED < 10)
        {
                RD0 = 0;
                RD1 = 0;        //LED点灯
                RD2 = 0;
                RD7 = 0;
                LED++;
        }
        else 
        {
                RD0 = 1;
                RD1 = 1;        //LED消灯
                RD2 = 1;
                RD7 = 1;
                LED++;
        if(LED == 20) LED = 0;
        }
}



void main(void)
{
        TRISD = 0;      //Dポートを出力モードに設定


        //タイマ1初期設定
        //T1CON レジスタ(Timer1 Control Resister)
        T1CKPS1 = 1;    //プリスケーラの設定 T1CKPS0とセットで 1/8のプリスケーラに設定
        T1CKPS0 = 1;    //11:1/8  10:1/4 01:1/2 00:1/1
        T1OSCEN = 0;    //外部専用発振器動作なし
        T1SYNC = 0;             //外部入力の内部クロックへの同期なし
        TMR1CS = 0;             //内部クロック(Fosc/4) // 1:外部クロックまたは発振回路
        TMR1ON = 1;             //タイマ1を作動させる // 0:作動させない


//Clock: 20MHz/4 → 5MHz 0.2μsec
// 100msec毎の割り込みを行う
//プリスケーラ 1/8 //Prescale Select bits

//    (65536 -N)*0.2*8 = 100000
//     N = 65536 - 100000 /8/0.2  = 3036
//     3036/256 = 11.8593
//     3036 -256*11 = 220
//     59286 ÷ 256 = 11 余り220
        TMR1H = 11;                             //
        TMR1L = 220;


        TMR1IE = 1;                             // タイマ1割り込み許可
        PEIE = 1;                               // 周辺割り込み許可許可
        GIE = 1;                                // グローバル割り込み許可

        while(1)
        {
        }


}


 

<HI-TECHコンパイラ編> PIC16F1937

PIC16F1937をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)  

<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


   <プログラム例>
//HI-TEC LED FreeRun       PIC16F1937
//割り込み方式   周期1秒: 点灯0.5秒、消灯0.5秒 

#include  <htc.h>

#define _XTAL_FREQ 20000000             //セラミック発振子:20MHz     ディレイ関数用

// コンフィギュレーションの設定
__CONFIG(
                FOSC_HS &                       // EXTRC Oscillator, RC on RA7/OSC1/CLKIN
                WDTE_OFF &              // Power-up Timer Enable bit// PWRT disabled
                PWRTE_ON &              // MCLR Pin Function Select// RE3/MCLR/VPP pin function is MCLR
                MCLRE_ON &              // RE3/MCLR/VPP pin function is digital input
                CP_OFF  &               // Program memory code protection is enabled
                CPD_OFF &               // Data memory code protection is enabled
                BOREN_OFF &             // Clock Out Enable bit// CLKOUT function is disabled. I/O or oscillator function on RA6/CLKOUT
                CLKOUTEN_OFF &  // CLKOUT function is enabled on RA6/CLKOUT pin
                IESO_OFF &              // Fail Clock Monitor Enable// Fail-Safe Clock Monitor is enabled
                FCMEN_ON                // Fail-Safe Clock Monitor is disabled
                );


__CONFIG(
                WRT_OFF &       // 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control
                PLLEN_OFF &     // 4x PLL disabled
                STVREN_OFF &// Brown-out Reset Voltage selection// Brown-out Reset Voltage (VBOR) set to 1.9 V
                BORV_19 &       // Brown-out Reset Voltage (VBOR) set to 2.7 V
//              DEBUG_OFF &     // Background debugger is enabled
                LVP_OFF         // HV on MCLR/VPP must not be used for programming
                );

int LED = 0;



void interrupt intT1(void)      //10msec毎の割り込み
{
        TMR1IF = 0;     //フラグクリア

//アップカウンタの値設定
//Clock: 20MHz/4 → 5MHz 0.2μsec
// 10msec毎の割り込みを行う
//プリスケーラ 1/8 //Prescale Select bits

//    (65536 -N)*0.2*8 = 10000
//     N = 65536 - 10000 /8/0.2  = 59286
//     59268/256 = 231
//     59286 -256*231 = 150
//     59286 ÷ 256 = 231 余り150
        TMR1H = 231;                            //
        TMR1L = 150;


        if(LED < 50)
        {
                LATD0 = 0;      //LED点灯
                LATD1 = 0;
                LATD2 = 0;
                LATD7 = 0;
                LED++;
        }
        else 
        {
                LATD0 = 1;      //LED消灯
                LATD1 = 1;
                LATD2 = 1;
                LATD7 = 1;
                LED++;
        if(LED == 100) LED = 0;
        }


}


void main()
{
        TRISD = 0;      //Dポートを出力モードに設定

//T1CON レジスタ(Timer1 Control Resister)
        TMR1CS1 = 0;    //Timer1 clock source: Fosc/4 //Timer1 Clock Source Select bits
        TMR1CS0 = 0;    //TMR1CS<1:0> = 00 → Fosc/4 // 01 → Fosc
        T1CKPS1 = 1;    //プリスケーラ 1/8 //Prescale Select bits
        T1CKPS0 = 1;    //T1CKPS<1:0> = 11 → 1/8 //10→1/4 01→1/2 00→1/1
        T1OSCEN = 0;    //LP Oscillator Enble Control bit
        nT1SYNC = 0;    //Timer1 External Clock Input Synchronization Control bit
        TMR1ON = 1;             //Enable Timer1 //Timer1 On bit

//T1GCON レジスタ(Timer1 Gate Control Resister)     // ゲート機能なし
        TMR1GE = 0;             //Timer1 Gate Enable bit
        T1GPOL = 0;             //Timer1 Gate Polarity bit
        T1GTM = 0;              //Timer1 Gate Toggle Mode bit
        T1GSPM = 0;             //Timer1 Gate Single Pulse Mode bit
        T1GGO = 0;              //Timer1 Gate Single-Pulse Acquisition Status bit
        T1GVAL = 0;             //Timer1 Gate current State bit
        T1GSS1 = 0;             //Timer1 Gate Source Select bits
        T1GSS0 = 0;



//Clock: 20MHz/4 → 5MHz 0.2μsec
// 10msec毎の割り込みを行う
//プリスケーラ 1/8 //Prescale Select bits

//    (65536 -N)*0.2*8 = 10000
//     N = 65536 - 10000 /8/0.2  = 59286
//     59268/256 = 231
//     59286 -256*231 = 150
//     59286 ÷ 256 = 231 余り150

        TMR1H = 231;                            //
        TMR1L = 150;




        TMR1IE = 1;                             // タイマ1割り込み許可
        PEIE = 1;                               // 周辺割り込み許可許可
        GIE = 1;                                // グローバル割り込み許可



        while(1)
        {
        
        }


}




 

 





<CCS編> PIC18F4550


  <試作品回路図>
    PIC18F4550をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル)   


<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています



<プログラム例>  <CCS編> 
    PIC18F4550 タイマ0の場合
/*
 インターバルタイマ0による LED点滅
*/
#include    <18F4550.h>

#use delay(clock=20000000)
#FUSES  HS,PUT,NOWDT,BROWNOUT,BORV43,NOPROTECT,NOLVP

unsigned long int TimeCount = 0;

#int_timer0                            //タイマ0割込み(10msec毎)
interval(){
        set_timer0(59286);             // 0.05μsec × 4 × 8 × 6250 = 10000μsec = 10msec (at システムクロック20MHz)
                                       // 256×256 - 6250 = 59286
                                       // タイマ0:16bitアップカウントタイマ → オーバーフローで割込み発生


        TimeCount++;                    //10msec毎にインクリメント
        if(TimeCount < 100)             //100カウント(1000msec = 10msec× 100)までは
        {
                output_low(PIN_B2);     //RB2=0 → LED:点灯 
                output_high(PIN_B3);    //RB3=1 → LED:消灯
                output_low(PIN_B4);     //RB4=0 → LED:点灯
        }
        else if(TimeCount < 200)        //1000カウント以上200カウント(2000msec = 10msec× 100)までは
        {
                Output_high(PIN_B2);    //RB2=1 → LED:消灯
                Output_low(PIN_B3);     //RB3=0 → LED:点灯
                Output_high(PIN_B4);    //RB4=1 → LED:消灯
        }
        else TimeCount = 0;


        return 0;
}

main(){

        setup_timer_0(RTCC_INTERNAL |RTCC_DIV_8);       //プリスケーラ 1/8 vs 1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256
        set_timer0(59286);


        enable_interrupts(INT_TIMER0);  //T0の割込み解除
        enable_interrupts(GLOBAL);      //全割込み解除


        while(1)                        // 割込みを待つ
        {
        }

        return 0;
}

//**********************************************************************************************
//**********************************************************************************************

<プログラム例>  <CCS編> 
    PIC18F4550 タイマ1の場合
/*
 インターバルタイマ1による LED点滅
*/
#include    <18F4550.h>
#use delay(clock=20000000)
#FUSES  HS,PUT,NOWDT,BROWNOUT,BORV43,NOPROTECT,NOLVP

unsigned long int TimeCount = 0;

#int_timer1                //タイマ1割込み(10msec毎に割込み発生)
interval(){
        set_timer0(59286); // 0.05μsec × 4 × 8 × 6250 = 10000μsec = 10msec (at システムクロック20MHz)
                           // 256×256 - 6250 = 59286
                           // タイマ0:16bitアップカウントタイマ → オーバーフローで割込み発生


        TimeCount++;            //10msec毎にインクリメント
        if(TimeCount < 100)     //100カウント(1000msec = 10msec× 100)までは
        {
                output_low(PIN_B2);             //RB2=0 → LED:点灯 
                output_high(PIN_B3);            //RB3=1 → LED:消灯
                output_low(PIN_B4);             //RB4=0 → LED:点灯
        }
        else if(TimeCount < 200)//1000カウント以上200カウント(2000msec = 10msec× 100)までは
        {
                Output_high(PIN_B2);    //RB2=1 → LED:消灯
                Output_low(PIN_B3);     //RB3=0 → LED:点灯
                Output_high(PIN_B4);    //RB4=1 → LED:消灯
        }
        else TimeCount = 0;


        return 0;
}

main(){

        setup_timer_1(T1_INTERNAL |T1_DIV_BY_8);        //プリスケーラ 1/8 vs 1 1/2 1/4 1/8 
        set_timer0(59286);


        enable_interrupts(INT_TIMER1);  //T0の割込み解除
        enable_interrupts(GLOBAL);      //全割込み解除


        while(1)                        // 割込みを待つ
        {
        }

        return 0;
}


//***********************************************************************************************
//***********************************************************************************************
<プログラム例>  <C18編> 
    PIC18F4550 タイマ0の場合

/*
 
Timer0 インターバルタイマによる
                                LED ON/OFF
// 1sec:ON   1sec:OFF
*/


#include <p18f4550.h>

#include <timers.h>

#pragma config PLLDIV = 5       //96MHz PLL Prescalar(1、2、3、4、5、6、10、12のみ) : 外部周波数÷4MHz
                                                        //20MHz ÷ 5 = 4MHz → 96MHz(=4MHz×24 :固定)
#pragma config USBDIV = 2       // Full Speed USB Clock Source Selection : 2(constant)
#pragma config CPUDIV = OSC1_PLL2       //CPU System Clock Postscaler 
                                                                        // PICのUSB制御用クロック周波数:48MHz(=96MHz ÷2)
#pragma config FOSC = HS // システムクロック=20MHz 
//#pragma config FOSC = HSPLL_HS        // システムクロック=48MHz

#pragma config WDT = OFF        //ウォッチドックタイマ OFF
#pragma config LVP = OFF        //Low Voltage Program OFF


unsigned long int TimeCount = 0;


#pragma interrupt int_timer0

#pragma code isrcode = 0x08
void isr_direct(void)
{ _asm goto int_timer0 _endasm }
#pragma code
void int_timer0(void)
{
        INTCONbits.TMR0IF = 0;  // タイマ0割り込みフラグを0にする
        WriteTimer0(59286);             // 0.05μsec × 4 × 8 × 6250 = 10000μsec = 10msec (at システムクロック20MHz)
                                                        // 256×256 - 6250 = 59286
                                                        // タイマ0:16bitアップカウントタイマ → オーバーフローで割込み発生

        TimeCount++;    //10msec毎にインクリメント
        if(TimeCount < 100)     //100カウント(1000msec = 10msec× 100)までは
        {
                LATBbits.LATB2 = 0;     //RB2=0 → LED:点灯 
                LATBbits.LATB3 = 1;     //RB3=1 → LED:消灯
                LATBbits.LATB4 = 0; //RB4=0 → LED:点灯
        }
        else if(TimeCount < 200)//1000カウント以上200カウント(2000msec = 10msec× 100)までは
        {
                LATBbits.LATB2 = 1;     //RB2=1 → LED:消灯
                LATBbits.LATB3 = 0; //RB3=0 → LED:点灯
                LATBbits.LATB4 = 1;     //RB4=1 → LED:消灯
        }
        else TimeCount = 0;


}


void main (void)
{
        TRISB = 0x00;// B portを出力モードに設定

                //タイマ0の設定 
         OpenTimer0
        (
                        TIMER_INT_ON &  //割込み:ON
                        T0_16BIT &              //16 bit モードに設定  vs  8bit モード( T0_8BIT )
                        T0_SOURCE_INT & //内部クロック使用
                        T0_PS_1_8               //8ビットプリスケーラ  1/8 vs 1/1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 
        );

        WriteTimer0(59286);

        RCONbits.IPEN = 0;              //割込み優先順位制御:OFF (RCON レジスタのIPENビット = 0)
        INTCONbits.TMR0IE = 1;  //タイマ0割込み許可
        INTCONbits.PEIE = 1;    //周辺割込み許可 
                                                        //INTCONレジスタの b6ビット : 低位割込み許可/禁止(割り込み優先順位制御     有りの場合)  
        INTCONbits.GIE = 1;             //全割込み許可
                                                        //INTCONレジスタの b7ビット : 高位割込み許可/禁止(割り込み優先順位制御  有りの場合)

        while (1)                       //何もしないで割込みを待つ
    {
    }
}




//**********************************************************************************************
//**********************************************************************************************
<プログラム例>  <C18編> 
    PIC18F4550 タイマ1の場合

/*
 
Timer1インターバルタイマによる
                                LED ON/OFF
// 1sec:ON   1sec:OFF
*/


#include <p18f4550.h>

#include <timers.h>

#pragma config PLLDIV = 5       //96MHz PLL Prescalar(1、2、3、4、5、6、10、12のみ) : 外部周波数÷4MHz
                                                        //20MHz ÷ 5 = 4MHz → 96MHz(=4MHz×24 :固定)
#pragma config USBDIV = 2       // Full Speed USB Clock Source Selection : 2(constant)
#pragma config CPUDIV = OSC1_PLL2       //CPU System Clock Postscaler 
                                                                        // PICのUSB制御用クロック周波数:48MHz(=96MHz ÷2)
#pragma config FOSC = HS // システムクロック=20MHz 
//#pragma config FOSC = HSPLL_HS        // システムクロック=48MHz

#pragma config WDT = OFF        //ウォッチドックタイマ OFF
#pragma config LVP = OFF        //Low Voltage Program OFF


unsigned long int TimeCount = 0;

#pragma interrupt my_Func

#pragma code isrcode = 0x08
void isr_direct(void)
{ _asm goto my_Func _endasm }
#pragma code

void my_Func(void)
{
        PIR1bits.TMR1IF = 0;    // タイマ1割り込みフラグを0にする
        WriteTimer1(59286);             // 0.05μsec × 4 × 8 × 6250 = 10000μsec = 10msec (at システムクロック20MHz)
                                                        // 256×256 - 6250 = 59286
                                                        // タイマ0:16bitアップカウントタイマ → オーバーフローで割込み発生

        TimeCount++;    //10msec毎にインクリメント
        if(TimeCount < 100)     //100カウント(1000msec = 10msec× 100)までは
        {
                LATBbits.LATB2 = 0;     //RB2=0 → LED:点灯 
                LATBbits.LATB3 = 1;     //RB3=1 → LED:消灯
                LATBbits.LATB4 = 0; //RB4=0 → LED:点灯
        }
        else if(TimeCount < 200)//1000カウント以上200カウント(2000msec = 10msec× 100)までは
        {
                LATBbits.LATB2 = 1;     //RB2=1 → LED:消灯
                LATBbits.LATB3 = 0; //RB3=0 → LED:点灯
                LATBbits.LATB4 = 1;     //RB4=1 → LED:消灯
        }
        else TimeCount = 0;


}


void main (void)
{
        TRISB = 0x00;// B portを出力モードに設定

                //タイマ0の設定 
         OpenTimer1
        (
                        TIMER_INT_ON &  //割込み:ON
                        T1_16BIT_RW &   //16 bit モードに設定  vs  8bit モード( T0_8BIT )
                        T1_SOURCE_INT & //内部クロック使用
                        T1_PS_1_8 &             //8ビットプリスケーラ  1/8 vs 1/1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 
                        T1_OSC1EN_OFF
        );

        WriteTimer1(59286);

        RCONbits.IPEN = 0;              //割込み優先順位制御:OFF (RCON レジスタのIPENビット = 0)
        PIE1bits.TMR1IE = 1;    //タイマ1割込み許可
        INTCONbits.PEIE =1;             //周辺割込み許可 
                                                        //INTCONレジスタの b6ビット : 低位割込み許可/禁止(割り込み優先順位制御     有りの場合)                                  
        INTCONbits.GIE = 1;             //全割込み許可
                                                        //INTCONレジスタの b7ビット : 高位割込み許可/禁止(割り込み優先順位制御  有りの場合)


        while (1)                       //何もしないで割込みを待つ
    {
    }
}


<XC8編>
<試作品回路図>
    PIC18F14K50をつかった場合の回路図を以下に示します。 (→回路図のPDFファイル) 



<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています





          

   <プログラム例>

//Led and LCd free Run Delay
//1sec:ON  1sec:OFF  T1:10msec  at 12MHz x 4 PLL

#include <p18f14K50.h>
#include <xc.h>

#include    <stdio.h>
#include    <stdarg.h>

#include "lcd_lib_XC8.h"

#define _XTAL_FREQ  48000000



#pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF,PCLKEN = ON
#pragma config FOSC = HS,PLLEN = ON, HFOFST = OFF           //PLL ON  Periferal= 12MHz x 4 = 48MHz
#pragma config PWRTEN = ON, BOREN = OFF, MCLRE = OFF, BORV = 30
#pragma config WDTEN = OFF,LVP = OFF,FCMEN = OFF, IESO = OFF
#pragma config CP0 = OFF,XINST = OFF
#pragma config STVREN = OFF, BBSIZ = OFF,CPB = OFF,CP1 = OFF,CPD = OFF  //省略するとwarnig がでる
#pragma config WRT0 = OFF,WRT1 = OFF,WRTC = OFF,WRTB = OFF,EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF //省略するとwarnig がでる


char Buf[17];   //液晶表示データの一時保存レジスタ
int Mode = 0;

int Count = 0;



void delay_ms(unsigned short msec)        //1msec遅延関数
{
        unsigned short i;

        for(i=0; i<msec; i++)
        __delay_ms(1);  // __delay_ms(n); //n = 1?16
 //     __delay_us(1);  //__delay_us(n); //n = 1?16426    //1μsec遅延関数

}

void lcd_printf(char* str)      //液晶表示補助関数
{
        while(*str)     //文字列終端の '\0'を検出するまで
        {
                lcd_data(*str);         // 1文字表示
                str++;
        }
}

void LedFunc(void)
{
     char* pStr;

     Count++;
     if(Count == 100)    //Count = 10 --> 100msec //Count = 1000 --> 1000msec
     {
         Count = 0;




     
    if(Mode == 0)
    {
        Mode = 1;


        LATCbits.LATC0 = 0;    //Led RC0 : OFF
        LATCbits.LATC1 = 0;
        LATCbits.LATC2 = 0;
        LATCbits.LATC3 = 0;


        lcd_cmd(0x80);      //1行目の先頭へ
        sprintf(pStr,"                   "     );       //文字列としてバッファーに収納
        lcd_printf(pStr);

        lcd_cmd(0xC0);//2行目の先頭へ
        sprintf(pStr,"    LED: OFF                 ");  //文字列としてバッファーに収納
        lcd_printf(pStr);

    }
    else
    {

        Mode = 0;



         LATCbits.LATC0 = 1;    //Led RC0 : ON
         LATCbits.LATC1 = 1;
         LATCbits.LATC2 = 1;
         LATCbits.LATC3 = 1;

        pStr = &Buf[0];
        lcd_cmd(0x80);      //1行目の先頭へ
        sprintf(pStr,"    LED: ON                  "     );     //文字列としてバッファーに収納
        lcd_printf(pStr);

        lcd_cmd(0xC0);//2行目の先頭へ
        sprintf(pStr,"                         ");      //文字列としてバッファーに収納
        lcd_printf(pStr);
    }

   }
}

    void interrupt isr(void)
    {

        PIR1bits.TMR1IF = 0;    // タイマ1割り込みフラグを0にする
        WriteTimer1(50512);             // 48MHz --> 0.0208μsec × 4 × 8 × 15024 = 10000μsec = 10msec (at システムクロック20MHz)
                                                        // 256×256 - 15024 = 50512
                                                        // タイマ0:16bitアップカウントタイマ → オーバーフローで割込み発生
        LedFunc();




    }




int main()
{
    ANSEL = 0x00;                                       // デジタルに設定
    TRISC = 0b11000000;
    TRISB = 0;
    char* pStr;


     TRISB = 0x00;// B portを出力モードに設定

                //タイマ0の設定
         OpenTimer1
        (
                        TIMER_INT_ON &  //割込み:ON
                        T1_16BIT_RW &   //16 bit モードに設定  vs  8bit モード( T0_8BIT )
                        T1_SOURCE_INT & //内部クロック使用
                        T1_PS_1_8 &             //8ビットプリスケーラ  1/8 vs 1/1 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 
                        T1_OSC1EN_OFF
        );

        WriteTimer1(50512);

        RCONbits.IPEN = 0;              //割込み優先順位制御:OFF (RCON レジスタのIPENビット = 0)
        PIE1bits.TMR1IE = 1;    //タイマ1割込み許可
        INTCONbits.PEIE =1;             //周辺割込み許可 
                                                        //INTCONレジスタの b6ビット : 低位割込み許可/禁止(割り込み優先順位制御     有りの場合)
        INTCONbits.GIE = 1;             //全割込み許可
                                                        //INTCONレジスタの b7ビット : 高位割込み許可/禁止(割り込み優先順位制御  有りの場合)



    lcd_init();                                 // LCD初期化
    lcd_cmd(0b00001100);        // カーソル:OFF    ブリンク:OFF
    lcd_clear();
    pStr = &Buf[0];

    lcd_cmd(0x80);      //1行目の先頭へ
    sprintf(pStr,"XC8");        //文字列としてバッファーに収納
    lcd_printf(pStr);

    lcd_cmd(0xC0);//2行目の先頭へ
    sprintf(pStr,"     Start !!");      //文字列としてバッファーに収納
    lcd_printf(pStr);



    delay_ms(2000);


    LATCbits.LATC0 = 0;         //Led RC0 : OFF
    LATCbits.LATC1 = 0;
    LATCbits.LATC2 = 0;
    LATCbits.LATC3 = 0;

    while(1)
    {


    }
    return 0;
}

//-----------------------------------------------------------------------------------------------
//************************************************
//インクルードファイル    lcd_lib_XC8.h
//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを
//XC8コンパイラ用に変更したものです。
//************************************************

// LCDポート設定
#define lcd_port_DB7    LATBbits.LATB7  //LCDのDB7(14番ピン)に接続されるPIC側ポート番号設定
#define lcd_port_DB6    LATBbits.LATB6  //LCDのDB6(13番ピン)に接続されるPIC側ポート番号設定
#define lcd_port_DB5    LATBbits.LATB5  //LCDのDB5 (12番ピン)に接続されるPIC側ポート番号設定
#define lcd_port_DB4    LATBbits.LATB4  //LCDのDB4(11番ピン)に接続されつPIC側ポート番号設定
#define lcd_stb         LATCbits.LATC5  //stb OutPort
#define lcd_rs          LATCbits.LATC4  // rs OutPort


void lcd_data(char asci);
void lcd_cmd(char cmd);
void lcd_clear(void);
void lcd_init(void);
void lcd_out(char code, char flag);




/////////////--------------------------------------------------------------------------------------------------------

//***********************************************
//インクルードファイル    lcd_lib_XC8.c
//このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリを
//XC8コンパイラ用に変更したものです。
//***********************************************

///////////////////////////////////////////////
//  液晶表示器制御ライブラリ for C18コンパイラー
//  内蔵関数は以下
//    lcd_init()    ----- 初期化
//    lcd_cmd(cmd)  ----- コマンド出力
//    lcd_data(chr) ----- 1文字表示出力
//    lcd_clear()   ----- 全消去
//////////////////////////////////////////////

#include    "lcd_lib_XC8.h"
#include    <p18f14K50.h>
#include <stdio.h>
#include <stdlib.h>

#define _XTAL_FREQ  48000000

//////// データ出力サブ関数
void lcd_out(char code, char flag)
{
        //port_Mode = 0;        // PIC側の DataPort、stbPort、 rsPort を出力モードに設定

        if(code & 0b10000000)lcd_port_DB7 = 1;  //LCDのDB7への出力セット
        else lcd_port_DB7 = 0;
        if(code & 0b01000000)lcd_port_DB6 = 1;  //LCDのDB6への出力セット
        else lcd_port_DB6 = 0;
        if(code & 0b00100000)lcd_port_DB5 = 1;  //LCDのDB5への出力セット
        else lcd_port_DB5 = 0;
        if(code & 0b00010000)lcd_port_DB4 = 1;  //LCDのDB4への出力セット
        else lcd_port_DB4 = 0;



        //lcd_port = code & 0xF0;

        if (flag == 0)
                lcd_rs = 1;                     //表示データの場合
        else
                lcd_rs = 0;                     //コマンドデータの場合


        _delay(10);     //Delay10TCYx(1);                       //10NOP

        lcd_stb = 1;                    //strobe out
        _delay(10);     //Delay10TCYx(1);                       //10NOP
        lcd_stb = 0;                    //reset strobe
}


//////// 1文字表示関数
void lcd_data(char asci)
{
        lcd_out(asci, 0);                       //上位4ビット出力
        lcd_out(asci<<4, 0);            //下位4ビット出力
        _delay(500);    //Delay10TCYx(50);                      //500NOP (50μsec待ち at 40MHz)
}


/////// コマンド出力関数
void lcd_cmd(char cmd)
{
        lcd_out(cmd, 1);                //上位4ビット出力
        lcd_out(cmd<<4, 1);             //下位4ビット出力
        if((cmd & 0x03) != 0)
                __delay_ms(2);    //Delay10KTCYx(2);            //2msec待ち at 40MHz
        else
                __delay_us(50); //Delay10TCYx(50);              //50usec待ち at 40MHz
}


/////// 全消去関数
void lcd_clear(void)
{
        lcd_cmd(0x01);                  //初期化コマンド出力
//  Delay10KTCYx(15);           //15msec待ち at 40MHz
}


/////// 初期化関数
void lcd_init(void)
{
        lcd_out(0x30, 1);               //8bit mode set
        __delay_ms(5);    //Delay10KTCYx(5);            //5msec待ち at 40MHz
        lcd_out(0x30, 1);               //8bit mode set
        __delay_ms(1);    //Delay10KTCYx(1);            //1msec待ち at 40MHz
        lcd_out(0x30, 1);               //8bit mode set
        __delay_ms(1);    //Delay10KTCYx(1);            //1msec待ち at 40MHz
        lcd_out(0x20, 1);               //4bit mode set
        __delay_ms(1);    //Delay10KTCYx(1);            //1msec待ち at 40MHz
        lcd_cmd(0x2E);                  //DL=0 4bit mode
        lcd_cmd(0x08);                  //display off C=D=B=0
        lcd_cmd(0x0D);                  //display on C=D=1 B=0
        lcd_cmd(0x06);                  //entry I/D=1 S=0
        lcd_cmd(0x01);                  //all clear
}




 





 <プログラム例> <C30編 dsPIC>(割込み方式)
  dsPIC30F2012のタイマ1を使った割込みの場合
 
<試作品回路図>
  dsPIC30F2012を使った例を以下に示します。(→回路図のPDFファイル
 PICへの書き込みはICSPをつかっています。





<試作品外観>  下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




<プログラム例>

//*******************************************************************
// LED フリーラン点滅(割込み方式)
//     周期6sec (ON:3sec OFF:3sec)
//*******************************************************************
//MPLABの"Project Window"で p30f2012.gldをScriptフォルダにlib30F2012-coff.aをLibフォルダに追加する

#include <p30f2012.h>
#include <timer.h>

_FOSC(CSW_FSCM_OFF &            // クロック切り替えなし、フェースセイフクロックモニタなし
      FRC_PLL16                 //内臓高速RC発振器(7.37MHz)PLL:16倍 → システムクロック=7.37×16=117.93MHz
                );
_FWDT(WDT_OFF);                 //ウォッチドックタイマ:OFF        

_FBORPOR(PBOR_ON &              //ブラウンアウトリセット機能:ON
                BORV_42 &       //ブラウンアウト電圧:4.2V
                PWRT_64 &       //パワーオンリセットタイマ64msec
                 MCLR_EN        //MCLR機能:ON
                );
_FGS(CODE_PROT_OFF);            //コードプロテクト:OFF

unsigned int TimeCount = 0;

void _ISR _T1Interrupt(void)    //10msec毎の割込み発生
{
        IFS0bits.T1IF = 0;      //IFS0レジスタの T1IF(タイマ1の割込み検出)フラグリセット

        TimeCount++;            //10msec毎にインクリメント
        if(TimeCount < 300)     //300カウント(3000msec = 10msec× 300)までは
        {
            
                LATBbits.LATB4 = 0;
                LATBbits.LATB5 = 0;
                LATBbits.LATB6 = 0;
                LATBbits.LATB7 = 0;
                LATFbits.LATF4 = 0;
                LATFbits.LATF5 = 0;
        }
        else if(TimeCount < 600)   //1000カウント以上600カウント(6000msec = 10msec× 600)までは
        {
                LATBbits.LATB4 = 1;
                LATBbits.LATB5 = 1;
                LATBbits.LATB6 = 1;
                LATBbits.LATB7 = 1;
                LATFbits.LATF4 = 1;
                LATFbits.LATF5 = 1;

        }
        else TimeCount = 0;
}



int main(void)
{
        TRISB = 0;                         //ポートBを出力モードに設定
        TRISF = 0;                         //ポートFを出力モードに設定                                 
       

        OpenTimer1(T1_ON &                 //タイマ1ON
                   T1_GATE_OFF &           //ゲート制御ON
                   T1_PS_1_64 &            //プリスケーラ 1/64
                   T1_SYNC_EXT_OFF &       //クロック同期制御OFF
                   T1_SOURCE_INT,          //クロック源:内部クロック
                   4606                    //10msec  →  10×1000×(117920000/4000000)/64=4606.25
                   );                      //10msec毎に

        ConfigIntTimer1(T1_INT_PRIOR_5 & T1_INT_ON);    //割込みレベル5 タイマ1割込みON
        EnableIntT1;                                    //割込み許可

        while(1)
        {
        }
        CloseTimer1();
        return 0;
}

<プログラム例> <C30編 dsPIC>  (割込み方式)
 dsPIC30F4013のタイマ1を使った割込みの場合

  <試作品回路図>   dsPIC30F4013を使った例を以下に示します。(→回路図のPDFファイル
 


<試作品外観>  下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


<プログラム例>
//*******************************************************************
// LED フリーラン点滅(割込み方式)
//     周期6sec (ON:3sec OFF:3sec)
//*******************************************************************

// MPLABのLink File 
//    Linler Script : p30f4013.gld 
//    Library File  : libp30F4013-coff.a

#include <p30f4013.h>
#include <timer.h>

_FOSC(CSW_FSCM_OFF &         // クロック切り替えなし、フェールセイフクロックモニタなし
                HS2_PLL8     //外部発振子周波数 × ポストスケーラ:1/2 × PLL:8倍  → 10MHz × 1/2×  8 = 40MHz
                );
_FWDT(WDT_OFF);              //ウォッチドックタイマ:OFF        

_FBORPOR(PBOR_ON &           //ブラウンアウトリセット機能:ON
                BORV_42 &               //ブラウンアウト電圧:4.2V
                PWRT_64 &    //パワーオンリセットタイマ64msec
                MCLR_EN      //MCLR機能:ON
                );
_FGS(CODE_PROT_OFF);         //コードプロテクト:OFF

unsigned int TimeCount = 0;

void _ISR _T1Interrupt(void)          //10msec毎の割込み発生
{
        IFS0bits.T1IF = 0;            //IFS0レジスタの T1IF(タイマ1の割込み検出)フラグリセット

        TimeCount++;                  //10msec毎にインクリメント
        if(TimeCount < 300)           //300カウント(3000msec = 10msec× 300)までは
        {
                LATBbits.LATB3 = 0;   //点灯
                LATBbits.LATB4 = 0;
                LATBbits.LATB5 = 0;
                LATBbits.LATB6 = 0;
                LATBbits.LATB7 = 0;
                LATBbits.LATB8 = 0;
        }
        else if(TimeCount < 600)        //1000カウント以上600カウント(000msec = 10msec× 600)までは
        {
                
                LATBbits.LATB3 = 1;     //消灯
                LATBbits.LATB4 = 1;
                LATBbits.LATB5 = 1;
                LATBbits.LATB6 = 1;
                LATBbits.LATB7 = 1;
                LATBbits.LATB8 = 1;

        }
        else TimeCount = 0;
}



int main(void)
{
        TRISB = 0;                                      //ポートBを出力モードに設定
                        
/// タイマ1周期 10msec
///     bit15:タイマOn制御ビット bit14:未実装 ビット13
        OpenTimer1(T1_ON  &                             //タイマ1ON
                                T1_GATE_OFF     &       //ゲート制御off
                                T1_PS_1_64 &            //プリスケーラ 1/64
                                T1_SYNC_EXT_OFF &       //クロック同期制御OFF
                                T1_SOURCE_INT   ,       //クロック源:内部クロック
                                1562                    //10msec→10×1000×(40MHz/4MHz)/64=1562.5→1563  PR1設定値=1562(=1563-1)
                                );


        ConfigIntTimer1(T1_INT_PRIOR_5 & T1_INT_ON);    //割込みレベル5 タイマ1割込みON
        EnableIntT1;                                    //割込み許可

        while(1)
        {
        }
        CloseTimer1();

        return 0;
}

<C30編 dsPIC LEDフリーラン点滅 32ビットタイマ 割り込み方式   > dsPIC4013

<試作品回路図>
    dsPIC4013を使った例を以下に示します。(→回路図のPDFファイル










<試作品外観>  下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています




   <プログラム例>
//*******************************************************************
// LED フリーラン点滅(割込み方式)
//    dsPIC 32ビットタイマ vs 16bit タイマ   dsPIC4013
//*******************************************************************

// MPLABのLink File 
//    Linler Script : p30f4013.gld 
//    Library File  : libp30F4013-coff.a

#include <p30f4013.h>
#include <timer.h>

_FOSC(CSW_FSCM_OFF &    // クロック切り替えなし、フェールセイフクロックモニタなし
                HS2_PLL16               //外部発振子周波数 × postscaler ×  PLL:16倍  → 10MHz × 1/2 × 16 = 80MHz
                );
_FWDT(WDT_OFF);                 //ウォッチドックタイマ:OFF        

_FBORPOR(PBOR_ON &              //ブラウンアウトリセット機能:ON
                BORV42 &                //ブラウンアウト電圧:4.2V
//              BORV_42 &               //ブラウンアウト電圧:4.2V  (旧 config 記載形式) 
                PWRT_64 &               //パワーオンリセットタイマ64msec
                MCLR_EN         //MCLR機能:ON
                );
_FGS(CODE_PROT_OFF);    //コードプロテクト:OFF



void _ISR _T23Interrupt(void)   //最少時間(実測4.7μsec)間隔の割込み発生(32ビットタイマ)

//void _ISR _T2Interrupt(void)  //最少時間(実測0.85μsec)間隔の割込み発生(16ビットタイマ)
{
        IFS0bits.T2IF = 0;                      //IFS0レジスタの T2IF(タイマ2の割込み検出)フラグリセット
//      IFS0bits.T3IF = 0;                      //IFS0レジスタの T3IF(タイマ2の割込み検出)フラグリセット




                LATDbits.LATD2 = 0;             //点灯    ×10個
                LATDbits.LATD2 = 1;             //消灯


}



int main(void)
{
        TRISD = 0;                                              //ポートBを出力モードに設定

//32ビットタイマ
OpenTimer23(
                        T2_ON   &                       //連結タイマ2・タイマ3:ON
                        T2_GATE_OFF     &       //ゲート制御OFF
                        T2_PS_1_1       &       //プリスケーラ 1/1
                //      T2_32BIT_MODE_ON        &       //
                //      T2_SYNC_EXT_OFF &       //クロック同期制御OFF
                        T2_SOURCE_INT,  //クロック源: 内部クロック
                                                        // 80MHz Fosc * 1/4 = 20MHz  → 0.05μsec
                                                        // 0.05μsec(= 0.05μsec × 1)  → 20MHz
                        1                       // 実測: 4.7μsec
                        );


        
//16ビットタイマ
/*
OpenTimer2(
                        T2_ON   &                       //連結タイマ2・タイマ3:ON
                        T2_GATE_OFF     &       //ゲート制御OFF
                        T2_PS_1_1       &       //プリスケーラ 1/1
                //      T2_SYNC_EXT_OFF &       //クロック同期制御OFF
                        T2_SOURCE_INT,  //クロック源: 内部クロック
                                                        // 80MHz Fosc * 1/4 = 20MHz  → 0.05μsec
                                                        // 0.05μsec(= 0.05μsec × 1)  → 20MHz
                        1                       // 実測:0.85μsec
                        );

*/


//      ConfigIntTimer2(T2_INT_PRIOR_5 & T2_INT_ON );   //割込みレベル5 連結タイマ2割込みON
        ConfigIntTimer23(T2_INT_PRIOR_5 & T2_INT_ON );  //割込みレベル5 連結タイマ23割込みON
        EnableIntT2;                                                                    //割込み許可

        while(1)
        {
        }
        CloseTimer1();

        return 0;
}


<動作結果>
 32ビットタイマは16ビットタイマに比べてオーバーヘッドがが大きい。 約4μsec程度のオーバーヘッドがある。

最大周波数  RD2端子出力波形 備考
32ビットタイマの場合
2131KHz
(実測Duty=4.7μsec)

16ビット]タイマの場合 
1.17MHz
(実測Duty=0.85μsec)




<C30編 PIC24F LEDフリーラン点滅  割込み方式>   PIC24FJ64GA002
 

<試作品回路図>
    PIC24FJ64GA002を使った例を以下に示します。(→回路図のPDFファイル


<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


  <プログラム例>



///************************************************************/
// LED フリーラン点滅 (割り込み方式)
//         周期 3sec (ON:2sec OFF:1sec)      PC24FJ64GA002
//************************************************************/
#include        "p24FJ64GA002.h"
#include <timer.h>

#define Clock   32000000        // 単位はHzで指定

/// コンフィギュレーション ビットの設定
_CONFIG1
(
                JTAGEN_OFF &    //JTAGポート: OFF
                GCP_OFF &       //コードプロテクト: OFF
                GWRP_OFF &      //書き込みプロテクト: OFF
                BKBUG_OFF &     //バックグランドデバック: OFF
                COE_OFF &       //クリップオン エミュレーション: OFF 
                ICS_PGx1&       //ICDピンの選択: EMUC/EMUDをPGC1/PGD1と共用
                FWDTEN_OFF      //ウォッチドックタイマ: OFF 
 )


_CONFIG2
(       
                IESO_OFF &      // 2速度スタートアップ機能:OFF
                FNOSC_FRCPLL &  //内臓高速RC発振(8MHZ)回路 + 4倍PLL → 32MHz(= 8MHz × 4)
//              FNOSC_PRI &     //外付け発振器 →  FNOSC_PRI: Primary oscillator (XT, HS, EC)
//              FNOSC_PRIPLL &  //外付け発振器 × 4PLL  → FNOSC_PRI: Primary oscillator (XT, HS, EC)   
                FCKSM_CSDCMD &  //クロック切替え制御:OFF クロックモニタ:OFF
                OSCIOFNC_OFF &  //OSCO/RC15 function: OSCO or Fosc/2
                IOL1WAY_OFF &   //RP Register Protection: Unlimited Writes To RP Registers
                I2C1SEL_PRI &   //I2C1 pins Select: Use Primary I2C1 pins
                POSCMOD_NONE    //主発振器無効化(内蔵FRCの場合等) Oscillator Selection:  Primary disabled
//              POSCMOD_HS              //HS発振器外付け、HS発振モード有効化  Oscillator Selection: POSCMOD_HS  HS oscillator 
)       




unsigned int TimeCount = 0;

void _ISR _T1Interrupt(void)          //10msec毎の割込み発生
{
        IFS0bits.T1IF = 0;            //IFS0レジスタの T1IF(タイマ1の割込み検出)フラグリセット

        TimeCount++;                  //10msec毎にインクリメント
        if(TimeCount < 200)           //2sec: 199カウント(2000msec = 10msec× (199-0+1)までは
        {
               
                LATBbits.LATB15 = 0;//点灯
                
        }
        else if(TimeCount < 300)        //1sec: 200カウント以上299カウント(1000msec = 10msec× (299-200+1))までは
        {
                
             
                LATBbits.LATB15 = 1;    //消灯
               

        }
        else TimeCount = 0;
}



/// メイン関数
int     main(void)
{
        CLKDIV = 0;     //内蔵FRC8MHz: 分周なし直結  ★このレジスタを明示的にリセットしておかないとFRCが分周されてくることがある(?)

        TRISB = 0;      //Bポートを出力モードに設定

/// タイマ1: 周期 10msec

        OpenTimer1(T1_ON        &       //タイマ1ON
                        T1_GATE_OFF &   //ゲート制御off
                        T1_PS_1_64      &       //プリスケーラ 1/64
                        T1_SYNC_EXT_OFF &       //クロック同期制御OFF
                        T1_SOURCE_INT,          //クロック源:内部クロック   T1_SOURCE_INT: Internal clock source 
                        2499);  //10msec→10×1000×(32MHz/2MHz)/64=2500  PR1設定値=2499( = 2500 - 1 )
                                        //24Fは2システムクロックが1命令である
       ConfigIntTimer1(T1_INT_PRIOR_5 & T1_INT_ON);    //割込みレベル5 タイマ1割込みON
        EnableIntT1;                                    //割込み許可

        while(1)
        {
        }

        CloseTimer1();

        return 0;
}



<PIC32MX>割り込み方式        C32コンパイラ編
  PIC32MX460F512L の場合

 

<試作品回路図>
    PIC32MX460F512Lを使った例を以下に示します。(→回路図のPDFファイル


<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています

 (注)上記写真に映っている部品について
   ★ PIC32MX460F512LののQFPが半田付けされているキバンアッシーはマイクロチップ社が開発用部品としてネットで販売している
     PIM(Plug in Module)と呼ばれるものです。EXPLORE 16と呼ばれる開発用ターゲットボード用のCPUボードです。
      上記写真にのっているPIMは以下です。
       ・メーカ:  マイクロチップテクノロジー社
       ・部品名称: Plug In Module ( →URL
       ・部品番号:  MA320002  ( →URL)
       ・販売単価: 25ドル
       ・コネクタ諸元: このキバンには下記の1.27mmピッチの25極メスコネクタが4個ついています。   
                  メーカ: Samtec
                  型式: SLM-125-01-L-S


   ★ ヘッダーピン
      ヘッダーピンのメーカ、型式、ネットで販売している会社については、マイクロチップ・テクノロジー・ジャパン株式会社のセールスの方から
     おしえていただきました。

     ・メーカ  : Samtec           http://www.samtec.com/
     ・型式 : TMS-125-01-G-S (→ カタログPDFファイル
     ・諸元: 1.27mmピッチのピンヘッダー、 PIMとの勘合するピンの長さが5.84mmと長くなっておりPIMとの勘合接触信頼性を重視していることがうかがえる。
          尚、ピンヘッダーに関する規格はないようである。 メーカによりピンの断面(太さ)が角0.46×0.46mmとは異なるヘッダーピンも存在する。接触信頼性の
          面から寸法値が異なる他メーカ品は避けたい。
          
     ・販売している会社 :

     (1)  AVNET(米国、通販会社) (→ URL)
         ・TMS-125-01-G-S がのっているAVNETのURL は下記です。
http://avnetexpress.avnet.com/store/em/EMController/Connector-Headers-and-PCB-Receptacles/Samtec/TMS-125-01-G-S-RA/_/R-1251095/A-1251095/An-0?action=part&catalogId=500201&langId=-10&storeId=500201&chLangId=-10

        ・AVNETの販売単価: 2.49ドル(1〜499個)、2.06ドル(500〜999個)、1.79ドル(1000個〜 ) //2010.8.22現在
                   最小販売単位は1個です。私はAVNETから20個、カードで購入しましたが送料は3.99ドルでした。
        ・AVNETの納期: 約3週間
     

      (2) 潟}ルツ電波 (→ URL) 2010年9月9日発売開始 !!
         ・TMS-125-01-G-S がのっているURL は下記です。
               https://www.marutsu.co.jp/user/shohin.php?p=94446
         ・283円/個(1〜3個)、 262円(4個以上)
 //2010.9/10現在


ヘッダーピン外観 寸法要約(→ PDFファイル

     

    ★ ユニバーサルキバン
      ・プリントパターンを 基板設計エディタ K2CADで設計して、 ネット通販のキバン屋さんに製作してもらいました。
      ・キバン諸元
        @寸法: 120mm × 150mm × 1.6mm
        A層数: 両面キバン
        Bレジスト: なし
      ・パターン仕様
        @マイクロチップのPIMを Samtec社ヘッダーピンTMS-125-01-G-S(1.27mmピッチ 25極)を介して接続する。
        APIMの端子はすぺて2.54mmピッチの3連のビア端子にオープンの状態で周辺に引き出す。
        B上記100個の3連ビア端子の外周をグランドパターンで囲む
        Cグランドパターンの更に外側を電源用のパターンで囲む
        E3端子レギュレータによる電源関連のパターンはあらかじめパターン化しておく
        F下記コネクタはとりつけられるようにパターン設計をしておく
           ICSP用RJ12コネクタ、USB Aコネクタ、USB mini Bコネクタ
      ・キバン製作
        製作を依頼したキバン屋さん: キバン本舗 ( → URL
        製作費用(キバン15枚、版代 及び送料の合計): 36,500 円(税込、カード決済)
        納期: 1週間


        

自作ユニバーサルキバン外観
(部品面)
自作ユニバーサルキバン外観
(半田面)

 

       ・プリントパターンデータ
         (1) 実体配線的回路図 (→ PDFファイル)             

        (2)プリントパターンのPDFファイル(→PDFファイル
          キバン屋さんにキバン製作を頼む場合、PDFファイルも参考に添付した方が間違いが少ないようです。
        (3)プリントパターンのデータファイル(→LHZファイル
          ガーバーデータ 及びドリルデータ等です。改良した為、上記の写真とは若干異なります。このLHZファイルをキバン屋さんに
          送ればキバンが製作できます。キバン製作を依頼する際はレジスト不要とキバン屋さんに指示してください。ユニバーサル
          キバンの場合レジストがない方が使いやすいと思います。
           データファイルはご随意にお使いになってかまいませんが、出来上がったキバンに関するトラブル等に関してはいっさい
          責任は負いかねますのであらかじめご了承願います。下記はこのキバン設計のK2CADのソースファイルです。データファイル
          内容の確認や 自分専用のユニバーサルキバンを設計する場合等にご利用ください。
             基板ファイル(→ .kcdファイル) 、基板設計ファイル(→ .bpfファイル

    

<プログラム 例1>

// PIC32MX460F512L    LEDフリー点滅 (タイマ1 16ビットタイマ 割り込み方式)
//                 周期2秒(点灯:1秒、消灯:秒)
#include <proc/p32mx460f512l.h>         //PIC32MX460F512L
#include <plib.h>               // PIC32 peripheral library 
                                                        //for SYSTEMConfigPerformance()

// コンフィギュレーション設定
// CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off
#pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2
#pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF, ICESEL=ICS_PGx2

int Clock = 80000000;   //80MHz
int LED = 0;


void __ISR(4,ipl2)T1Hander(void)        //タイマ1割込 100msec毎
{
        mT1ClearIntFlag();  //フラグクリア

        if(LED < 10)
        {
                LATAbits.LATA4 = 1;
                LATAbits.LATA5 = 1;
                LATAbits.LATA6 = 1;
                LATAbits.LATA7 = 1;
                LED++;
        }
        else 
        {
                LATAbits.LATA4 = 0;
                LATAbits.LATA5 = 0;
                LATAbits.LATA6 = 0;
                LATAbits.LATA7 = 0;
                LED++;
                if(LED == 20) LED = 0;
        }
}

int main(void)
{
        SYSTEMConfigPerformance(80000000);      // システム最適化

        DDPCONbits.JTAGEN = 0;//        //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に設定する必要があります。
                //From the data sheet
                //"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices.
                // At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O,
                // the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug,
                // the user’s application code must maintain JTAGEN bit = 1." 
                //DDPCON<3>) bit = 0
                //bit 3 JTAGEN: JTAG Port Enable bit
                //    1 = Enable JTAG Port
                //    0 = Disable JTAG Port


        OpenTimer1(T1_ON | //      タイマ1 イネーブル  //T1_OFF → タイマ1 ディセーブル
                   T1_SOURCE_INT | //クロックソース:インターナル //T1_SOURCE_EXT → 外部発振器
                   T1_PS_1_256,    //プリスケール 1/256   //1/1、1/2、1/4、1/8、1/16、1/32、1/64、1/256
                   31249   //PRx値:  T0[msec] = 1000/80000000*256*31249 =99.9968 msec
                                                //PICMX32は1クロックで1命令
                                                //周期 T0[sec] = 1/Fosc × プリスケーラの逆数 × PRx値
                   );
        ConfigIntTimer1(T1_INT_ON | T1_INT_PRIOR_2);    //タイマ1割込ON、割り込みレベル2
        INTEnableSystemMultiVectoredInt();      //割り込みをマルチベクタモードで許可

        TRISAbits.TRISA4 = 0;
        TRISAbits.TRISA5 = 0;

        TRISAbits.TRISA6 = 0;
        TRISAbits.TRISA7 = 0;

        while(1)
        {
        }

}

<プログラム 例2>
// PIC32MX460F512L    LEDフリー点滅 (タイマ4+5 32ビット割り込み方式)
//                 周期2秒(点灯:1秒、消灯:秒)
#include <proc/p32mx460f512l.h>         //PIC32MX460F512L
#include <plib.h>               // PIC32 peripheral library 
                                                        //for SYSTEMConfigPerformance()

// コンフィギュレーション設定
// CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off
#pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2
#pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1
#pragma config FWDTEN=OFF, ICESEL=ICS_PGx2

int Clock = 80000000;   //80MHz

int LED = 0;



void __ISR(20,ipl2)T45Hander(void)      //タイマ4+5 割り込み 1sec毎
{
        mT5ClearIntFlag();  //フラグクリア

        if(LED == 0)
        {
                LED = 1;
                LATAbits.LATA4 = 1;     //LED OFF
                LATAbits.LATA5 = 1;
                LATAbits.LATA6 = 1;
                LATAbits.LATA7 = 1;
                LED++;
        }
        else 
        {
                LED = 0;
                LATAbits.LATA4 = 0;     //LED ON
                LATAbits.LATA5 = 0;
                LATAbits.LATA6 = 0;
                LATAbits.LATA7 = 0;
        }

                                
}

int main(void)
{
        SYSTEMConfigPerformance(80000000);      // システム最適化

        DDPCONbits.JTAGEN = 0;//        //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に設定する必要があります。
                //From the data sheet
                //"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices.
                // At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O,
                // the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug,
                // the user’s application code must maintain JTAGEN bit = 1." 
                //DDPCON<3>) bit = 0
                //bit 3 JTAGEN: JTAG Port Enable bit
                //    1 = Enable JTAG Port
                //    0 = Disable JTAG Port

        OpenTimer45(T45_ON |    //      タイマ1 イネーブル  //T1_OFF → タイマ1 ディセーブル
                    T45_SOURCE_INT |        //クロックソース:インターナル //T1_SOURCE_EXT → 外部発振器
                    T45_PS_1_256,   //プリスケール 1/256   //1/1、1/2、1/4、1/8、1/16、1/32、1/64、1/256
                    312499          //PRx値:  T0[msec] = 1000/80000000*256*312499 =0.999968 msec
                                                //PICMX32は1クロックで1命令
                                                //周期 T0[sec] = 1/Fosc × プリスケーラの逆数 × PRx値
                    );
        ConfigIntTimer45(T45_INT_ON | T45_INT_PRIOR_2); //タイマ1割込ON、割り込みレベル2
        INTEnableSystemMultiVectoredInt();      //割り込みをマルチベクタモードで許可

        TRISAbits.TRISA4 = 0;
        TRISAbits.TRISA5 = 0;

        TRISAbits.TRISA6 = 0;
        TRISAbits.TRISA7 = 0;



        while(1)
        {
        }

}

 

 

<PIC32MZ  Harmony  XC32 コンパイラ編> 割込み方式方式 
  PIC32MZ2048ECG144 の場合

<試作品の仕様>
 1.  ハード 


  

  PIC: PIC32MZ2048ECH144 rev.3( at Microchip PIC32MZ Embedded Connectivity (EC) Starter Kit


  

  Microchip 168pin to 132pin Adaptor board、 I/O Expansion board  及び ユニバーサルキバンのキバン構成とする。


  

2.  開発環境


  

Harmony Ver.1.00 XC32 Ver.1.33 MPLABX Ver.2.15USBブートローダ書込み


  




<試作品回路図>
    PIC32MZ2048ECG144を使った例を以下に示します。(→回路図のPDFファイル


  




  

<試作品の外観>   下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています


  



          


  
   <プログラム例>


//以下 main.c
//----------------------------------------------------------------------------------------
/*******************************************************************************
  MPLAB Harmony Project Main Source File

  Company:
    Microchip Technology Inc.
  
  File Name:
    main.c

  Summary:
    This file contains the "main" function for an MPLAB Harmony project.

  Description:
    This file contains the "main" function for an MPLAB Harmony project.  The
    "main" function calls the "SYS_Initialize" function to initialize the state 
    machines of all MPLAB Harmony modules in the system and it calls the 
    "SYS_Tasks" function from within a system-wide "super" loop to maintain 
    their correct operation. These two functions are implemented in 
    configuration-specific files (usually "system_init.c" and "system_tasks.c")
    in a configuration-specific folder under the "src/system_config" folder 
    within this project's top-level folder.  An MPLAB Harmony project may have
    more than one configuration, each contained within it's own folder under
    the "system_config" folder.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

//Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include <stddef.h>                     // Defines NULL
#include <stdbool.h>                    // Defines true
#include <stdlib.h>                     // Defines EXIT_FAILURE
#include "system/common/sys_module.h"   // SYS function prototypes


// *****************************************************************************
// *****************************************************************************
// Section: Main Entry Point
// *****************************************************************************
// *****************************************************************************

int main ( void )
{
    /* Initialize all MPLAB Harmony modules, including application(s). */
    SYS_Initialize ( NULL );

    while ( true )
    {
        /* Maintain state machines of all polled MPLAB Harmony modules. */
        SYS_Tasks ( );

    }

    /* Execution should not come here during normal operation */

    return ( EXIT_FAILURE );
}


/*******************************************************************************
 End of File
*/



//以下 app.c
//------------------------------------------------------------------------------
/*******************************************************************************
  MPLAB Harmony Application Source File
  
  Company:
    Microchip Technology Inc.
  
  File Name:
    app.c

  Summary:
    This file contains the source code for the MPLAB Harmony application.

  Description:
    This file contains the source code for the MPLAB Harmony application.  It 
    implements the logic of the application's state machine and it may call 
    API routines of other MPLAB Harmony modules in the system, such as drivers,
    system services, and middleware.  However, it does not call any of the
    system interfaces (such as the "Initialize" and "Tasks" functions) of any of
    the modules in the system or make any assumptions about when those functions
    are called.  That is the responsibility of the configuration-specific system
    files.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files 
// *****************************************************************************
// *****************************************************************************

#include "app.h"

# ifndef _MY_INCLUDE_PERIPHERAL
#define   _MY_INCLUDE_PERIPHERAL
#include <peripheral/peripheral.h>
#include <peripheral/ports/plib_ports.h>
#endif


// *****************************************************************************
// *****************************************************************************
// Section: Global Data Definitions
// *****************************************************************************
// *****************************************************************************

// *****************************************************************************
/* Application Data

  Summary:
    Holds application data

  Description:
    This structure holds the application's data.

  Remarks:
    This structure should be initialized by the APP_Initialize function.
    
    Application strings and buffers are be defined outside this structure.
*/

APP_DATA appData;


// *****************************************************************************
// *****************************************************************************
// Section: Application Callback Functions
// *****************************************************************************
// *****************************************************************************

/* TODO:  Add any necessary callback funtions.
*/


// *****************************************************************************
// *****************************************************************************
// Section: Application Local Functions
// *****************************************************************************
// *****************************************************************************

/* TODO:  Add any necessary local functions.
*/


// *****************************************************************************
// *****************************************************************************
// Section: Application Initialization and State Machine Functions
// *****************************************************************************
// *****************************************************************************

/*******************************************************************************
  Function:
    void APP_Initialize ( void )

  Remarks:
    See prototype in app.h.
 */

void APP_Initialize ( void )
{
    /* Place the App state machine in its initial state. */
    appData.state = APP_STATE_INIT;
    
    /* TODO: Initialize your application's state machine and other
     * parameters.
     */
          //LEDポート 出力ポートに設定--------------------

    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 0 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 1 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_H, 2 );
    PLIB_PORTS_PinDirectionOutputSet( PORTS_ID_0, PORT_CHANNEL_G, 15 );

/*
    TRISHbits.TRISH0 = 0;   //RH0 : out //LED 出力ポートに設定
    TRISHbits.TRISH1 = 0;   //RH1 : out
    TRISHbits.TRISH2 = 0;   //RH2 : out
    TRISGbits.TRISG15 = 0;  //RG15 : out
*/



    //初期設定: LED消灯
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 0 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 1 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 2 );
   PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 );

/*
    LATHbits.LATH0 = 0;     //RH0 = 0  LED --> OFF  //LED消灯
    LATHbits.LATH1 = 0;     //RH1 = 0  LED --> OFF
    LATHbits.LATH2 = 0;     //RH2 = 0  LED --> OFF
    LATGbits.LATG15 = 0;    //RG15 = 0 LED --> OFF
*/
}


/******************************************************************************
  Function:
    void APP_Tasks ( void )

  Remarks:
    See prototype in app.h.
 */

void APP_Tasks ( void )
{
    /* Check the application's current state. */
    switch ( appData.state )
    {
        /* Application's initial state. */
        case APP_STATE_INIT:
        {
            break;
        }

        /* TODO: implement your application state machine.*/

        /* The default state should never be executed. */
        default:
        {
            /* TODO: Handle error in application's state machine. */
            break;
        }
    }
}
 

/*******************************************************************************
 End of File
 */



//以下 system_init.c
//--------------------------------------------------------------------------------
/*******************************************************************************
  System Initialization File

  File Name:
    system_init.c

  Summary:
    This file contains source code necessary to initialize the system.

  Description:
    This file contains source code necessary to initialize the system.  It
    implements the "SYS_Initialize" function, configuration bits, and allocates
    any necessary global system resources, such as the systemObjects structure
    that contains the object handles to all the MPLAB Harmony module objects in
    the system.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2013-2014 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include "system_config.h"
#include "app.h"
#include "system_definitions.h"


// ****************************************************************************
// ****************************************************************************
// Section: Configuration Bits
// ****************************************************************************
// ****************************************************************************

//コンフィグ設定
// DEVCFG0
#pragma config EJTAGBEN = NORMAL
#pragma config DBGPER = ALLOW_PG2
#pragma config FSLEEP = OFF
#pragma config FECCCON = OFF_UNLOCKED
#pragma config BOOTISA = MIPS32
#pragma config TRCEN = OFF
#pragma config ICESEL = ICS_PGx2
#pragma config JTAGEN = OFF //JTAG ポート Disable
#pragma config DEBUG = ON


// DEVCFG1
#pragma config FNOSC = SPLL //発振器選択:システム発振回路 //内蔵FRC(8MHz)の場合:FNOSC = FRCDIV   //Oscillator Selection Bits (Fast RC Osc w/Div-by-N (FRCDIV))
#pragma config DMTINTV = WIN_127_128 // DMT Count Window Interval (Window/Interval value is 127/128 counter value)
#pragma config FSOSCEN = OFF // Secondary Oscillator Enable (Disable SOSC)
#pragma config IESO = OFF // Internal/External Switch Over (Disabled)
#pragma config POSCMOD = EC // Primary Oscillator Configuration (Primary osc disabled)
#pragma config OSCIOFNC = ON // CLKO Output Signal Active on the OSCO Pin (Enabled)
#pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disabled, FSCM Disabled)
#pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576)
#pragma config WDTSPGM = STOP // Watchdog Timer Stop During Flash Programming (WDT stops during Flash programming)
#pragma config WINDIS = NORMAL // Watchdog Timer Window Mode (Watchdog Timer is in non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Disable
#pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window size is 25%)
// DMTCNT = No Setting
#pragma config FDMTEN = OFF // Deadman Timer Enable (Deadman Timer is disabled)


//システムクロック:200MHz
//ペリフェラル周波数:OSC configulationで設定   //8種類選択可能
//PBxDIV: PERIPHERAL BUS CLOCK DIVISOR CONTROL レジスタのPBDIV<6:0>: Peripheral Bus Clock Divisor Control ビットで設定    //1/1 ? 1/128
//DEVCFG2
#pragma config FPLLIDIV = DIV_3 // 1/3  // PLL Input周波数 = 24MHz ÷ 3 = 8MHz     // System PLL Input Divider (1x Divider)
#pragma config FPLLRNG = RANGE_5_10_MHZ //PLL周波数入力範囲設定// System PLL Input Range (5-10 MHz Input)  //8MHz故
#pragma config FPLLICLK = PLL_POSC //主発振回路選択 //内蔵FRC(8MHz)の場合はFPLLICLK = PLL_FRC//  System PLL Input Clock Selection (POSC is input to the System PLL)
#pragma config FPLLMULT = MUL_50 //PLL倍率:50倍 //8MHz x 50 = 400MHz  //System PLL Multiplier (PLL Multiply by 50)
#pragma config FPLLODIV = DIV_2 // 1/2  //システムクロック = 400MHz ÷ 2 = 200MHz 
#pragma config UPLLFSEL = FREQ_24MHZ //USBのPLL入力を 24MHz→12MHzに変換 // USB PLL Input Frequency Selection (USB PLL input is 12 MHz)
#pragma config UPLLEN = ON //USBのPLL変換:イネーブル // USB PLL Enable (USB PLL is enabled)


// DEVCFG3
//イーサネット  // USERID = No Setting
#pragma config FMIIEN = ON // Ethernet RMII/MII Enable (MII Enabled)
#pragma config FETHIO = ON // Ethernet I/O Pin Select (Default Ethernet I/O)
#pragma config PGL1WAY = ON // Permission Group Lock One Way Configuration (Allow only one reconfiguration)
#pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration)
#pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration)
#pragma config FUSBIDIO = OFF // USB USBID Selection (Controlled by Port Function)



/*** BF1SEQ0 ***/

#pragma config TSEQ =       0xffff
#pragma config CSEQ =       0xffff


// *****************************************************************************
// *****************************************************************************
// Section: Library/Stack Initialization Data
// *****************************************************************************
// *****************************************************************************/



// *****************************************************************************
// *****************************************************************************
// Section: Driver Initialization Data
// *****************************************************************************
// *****************************************************************************




// *****************************************************************************
// *****************************************************************************
// Section: System Data
// *****************************************************************************
// *****************************************************************************

/* Structure to hold the object handles for the modules in the system. */
SYSTEM_OBJECTS sysObj;

// *****************************************************************************
// *****************************************************************************
// Section: Module Initialization Data
// *****************************************************************************
// *****************************************************************************

// *****************************************************************************
/* System Clock Initialization Data
*/

const SYS_CLK_INIT sysClkInit =
{
    .moduleInit = {0},
    .systemClockSource = SYS_CLK_SOURCE,
    .systemClockFrequencyHz = SYS_CLK_FREQ,
    .waitTillComplete = true,
    .secondaryOscKeepEnabled = true,
    .onWaitInstruction = SYS_CLK_ON_WAIT,
};


/*** System Device Control Initialization Data ***/

const SYS_DEVCON_INIT sysDevconInit =
{
    .moduleInit = {0},
};


// *****************************************************************************
// *****************************************************************************
// Section: Static Initialization Functions
// *****************************************************************************
// *****************************************************************************

/*******************************************************************************
  Function:
    void DRV_TMR0_Initialize(void)

  Summary:
    Initializes Timer Driver Instance 0

  Remarks:
 */
void DRV_TMR0_Initialize(void)
{
      /* Setup TMR0 Instance */
    PLIB_TMR_Stop(TMR_ID_1); /* Disable Timer */
    PLIB_TMR_ClockSourceSelect(TMR_ID_1, TMR_CLOCK_SOURCE_PERIPHERAL_CLOCK); /* Select clock source */
    PLIB_TMR_PrescaleSelect(TMR_ID_1, TMR_PRESCALE_VALUE_256); /* Select prescalar value */
    PLIB_TMR_Mode16BitEnable(TMR_ID_1); /* Enable 16 bit mode */
    PLIB_TMR_Counter16BitClear(TMR_ID_1); /* Clear counter */

    /* Setup Interrupt */
    PLIB_INT_SourceEnable(INT_ID_0, INT_SOURCE_TIMER_1);
    PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_T1, INT_PRIORITY_LEVEL1);
    PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_T1, INT_SUBPRIORITY_LEVEL2);


    PLIB_TMR_Period16BitSet(TMR_ID_1,39063);    //5 nsec x2  x 39063 x 256 = 100.00128msec = 100msec
    PLIB_TMR_Start(TMR_ID_1);    //タイマスタート
}

// *****************************************************************************
// *****************************************************************************
// Section: System Initialization
// *****************************************************************************
// *****************************************************************************

/*******************************************************************************
  Function:
    void SYS_Initialize ( SYS_INIT_DATA *data )

  Summary:
    Initializes the board, services, drivers, application and other modules.

  Remarks:
    See prototype in system/common/sys_module.h.
 */

void SYS_Initialize ( void* data )
{
    /* Core Processor Initialization */
    SYS_CLK_Initialize(&sysClkInit);
    sysObj.sysDevcon = SYS_DEVCON_Initialize(SYS_DEVCON_INDEX_0, (SYS_MODULE_INIT*)&sysDevconInit);
    SYS_DEVCON_PerformanceConfig(SYS_DEVCON_SYSTEM_CLOCK);

    /* System Services Initialization */    
    SYS_INT_Initialize();  

    /* Initialize Drivers */
    /* Timer Instanace 0 Call */
    DRV_TMR0_Initialize();
 
 
    /* Initialize System Services */

    /* Initialize Middleware */

    /* Enable Global Interrupts */
    SYS_INT_Enable();

    /* Initialize the Application */
    APP_Initialize();
}

/*******************************************************************************
 End of File
*/



//以下 system_interrupt.c
//----------------------------------------------------------------------------------------------
/*******************************************************************************
 System Interrupts File

  File Name:
    system_int.c

  Summary:
    Raw ISR definitions.

  Description:
    This file contains a definitions of the raw ISRs required to support the
    interrupt sub-system.

  Summary:
    This file contains source code for the interrupt vector functions in the
    system.

  Description:
    This file contains source code for the interrupt vector functions in the
    system.  It implements the system and part specific vector "stub" functions
    from which the individual "Tasks" functions are called for any modules
    executing interrupt-driven in the MPLAB Harmony system.

  Remarks:
    This file requires access to the systemObjects global data structure that
    contains the object handles to all MPLAB Harmony module objects executing
    interrupt-driven in the system.  These handles are passed into the individual
    module "Tasks" functions to identify the instance of the module to maintain.
 *******************************************************************************/

// DOM-IGNORE-BEGIN
/*******************************************************************************
Copyright (c) 2011-2014 released Microchip Technology Inc.  All rights reserved.

Microchip licenses to you the right to use, modify, copy and distribute
Software only when embedded on a Microchip microcontroller or digital signal
controller that is integrated into your product or third party product
(pursuant to the sublicense terms in the accompanying license agreement).

You should refer to the license agreement accompanying this Software for
additional information regarding your rights and obligations.

SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER
CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR
OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
(INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
 *******************************************************************************/
// DOM-IGNORE-END


// *****************************************************************************
// *****************************************************************************
// Section: Included Files
// *****************************************************************************
// *****************************************************************************

#include <xc.h>
#include <sys/attribs.h>
#include "app.h"
#include "system_definitions.h"

# ifndef _MY_INCLUDE_PERIPHERAL
#define   _MY_INCLUDE_PERIPHERAL
#include <peripheral/peripheral.h>
#include <peripheral/ports/plib_ports.h>
#endif

int IntervalCount = 0;


// *****************************************************************************
// *****************************************************************************
// Section: System Interrupt Vector Functions
// *****************************************************************************
// *****************************************************************************
void __ISR(_TIMER_1_VECTOR, ipl1) _IntHandlerDrvTmrInstance0(void)
{
       PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_1);
//    IFS0bits.T1IF= 0;    //タイマ1割り込みフラグクリア
    
    PLIB_TMR_Period16BitSet(TMR_ID_1,39063);    //5 nsec x2  x 39063 x 256 = 100.00128msec = 100msec



    if( IntervalCount < 11)    //100msec x 10 = 1000msec
        {

            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 0 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 1 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_H, 2 );
            PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 );

        /*
            LATHbits.LATH0 = 1;     //RH0 = 1  LED --> ON   //LED点灯
            LATHbits.LATH1 = 1;     //RH1 = 1  LED --> ON
            LATHbits.LATH2 = 1;     //RH2 = 1  LED --> ON
            LATGbits.LATG15 = 1;    //RG15 = 1 LED --> ON
        */

        }
    else                //100mse x 10 = 1000msec
        {
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 0 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 1 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_H, 2 );
            PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 );

        /*
            LATHbits.LATH0 = 0;     //RH0 = 0  LED --> OFF  //LED消灯
            LATHbits.LATH1 = 0;     //RH1 = 0  LED --> OFF
            LATHbits.LATH2 = 0;     //RH2 = 0  LED --> OFF
            LATGbits.LATG15 = 0;    //RG15 = 0 LED --> OFF
        */

            if(IntervalCount == 20) IntervalCount = 0;
        }
        IntervalCount++;
}



/*******************************************************************************
 End of File
*/